设置自定义收集器时不会提升::log尊重关键字::max_size吗?
Doesn't boost::log respect keywords::max_size when custom collector is set?
我正在使用 Boost 1.61,我最终想要的是:
如果当前日志文件- 的大小达到
FILE_ROTATION_SIZE
,则轮换当前日志文件 - 使用自定义收集器处理旋转文件以进行进一步压缩(这是压缩旋转文件的正确方法吗?
- 如果文件的总大小达到
FILES_MAX_SIZE
,请删除一些最旧的(理想的压缩(文件
现在,没有任何收集器,我只需使用以下代码片段即可实现第 1 点和第 3 点
sink = logging::add_file_log(
keywords::file_name = fileName,
keywords::rotation_size = FILE_ROTATION_SIZE,
keywords::scan_method = sinks::file::scan_method::scan_matching,
keywords::target = logDir.native(),
keywords::max_size = FILES_MAX_SIZE,
keywords::format =
(
expr::stream
<< expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
<< " " << expr::attr< boost::log::attributes::current_thread_id::value_type >("ThreadID") << " "
<< "<" << expr::attr< Logger::SeverityLevel >("Severity") << "> "
<< expr::message
<< expr::attr< std::wstring >("Suffix")
),
keywords::auto_flush = true
);
但是,当设置具有继承自sink->locked_backend()->set_file_collector(_fileCollector);
的收集器时
boost::log::sinks::file::collector
现在基本上什么都不做,文件仍然继续轮换,但旧文件不会被删除。
收集器的外观如下:
class FileCollector : public boost::log::sinks::file::collector
{
virtual void store_file(boost::filesystem::path const& src_path) override;
virtual uintmax_t scan_for_files(boost::log::sinks::file::scan_method method,
boost::filesystem::path const& pattern = boost::filesystem::path(),
unsigned int* counter = 0) override;
};
void FileCollector::store_file(boost::filesystem::path const& src_path)
{
LOG << "src_path: " << src_path;
}
uintmax_t FileCollector::scan_for_files(boost::log::sinks::file::scan_method method,
boost::filesystem::path const& pattern,
unsigned int* counter)
{
return 1;
}
scan_for_files()
根本没有被召唤。
从这个问题的答案中,我可以看到作者说max_size
是一个收集器参数,所以我认为应该有某种方法在我的FileCollector
类中设置它。 调用sinks::file::make_collector()
而不是继承自定义收集器似乎不是一种选择,因为它没有提供所需store_file()
回调的方法, 我计划放置压缩逻辑的地方。
这是否意味着我应该继续跟踪总大小并在自己需要时处理删除?
谢谢!
压缩旋转文件的正确方法吗?
是的,如果您必须在应用程序中执行此操作。请注意,除非使用异步日志记录,否则日志文件轮换是同步完成的。这意味着在压缩日志文件时,应用程序中的某些随机日志语句将需要相当长的时间才能完成。
更好的解决方案可能是使用单独的服务(如 logrotate(,该服务将处理日志轮换和压缩,而不会干扰应用程序性能。
这是否意味着我应该继续跟踪总大小并在自己需要时处理删除?
是的,文件收集器全权负责管理轮换的文件。每当调用store_file
时,文件收集器都必须执行必要的步骤来压缩文件并将其存储在目标存储中,并可能删除任何较旧的文件。
target
和max_size
等参数由 Boost.Log 中实现的文件收集器解释,该文件收集器由sinks::file::make_collector
创建。如果你实现自己的收集器,你必须以你自己的方式初始化它 - 可能是通过将这些参数传递给收集器构造函数。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- <streamsize>C++ 中 numeric_limits::max() 的值
- 黑客级别的Mini-Max Sum
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 谷歌模拟和覆盖关键字
- 关于 std::min, std::max 中的比较运算符的混淆
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么Visual Studio 2019不支持用于减少Openmp的关键字"max"?