我正在使用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()
根本没有被调用。
从the answer to this question,我可以看到作者说max_size
是一个收集器参数,所以我假设应该有某种方式在我的FileCollector
类中设置它。调用sinks::file::make_collector()
而不是继承自定义收集器似乎不是一种选择,因为它没有提供所需store_file()
回调的方法,我计划放置压缩逻辑。
这是否意味着我应该跟踪总大小并在需要时自行处理删除?
谢谢!
答案 0 :(得分:1)
这是压缩旋转文件的正确方法吗?
是的,如果您必须在申请中执行此操作。请注意,除非您使用异步日志记录,否则日志文件轮换将同步完成。这意味着在压缩日志文件时,应用程序中的某些随机日志语句需要相当长的时间才能完成。
更好的解决方案可能是使用单独的服务,例如logrotate,它将处理日志轮换和压缩,而不会干扰您的应用程序性能。
这是否意味着我应该跟踪总大小并在需要时自行处理删除?
是的,文件收集器完全负责管理旋转的文件。每当调用store_file
时,文件收集器必须执行必要的步骤以将文件压缩并存储在目标存储中,并可能删除任何旧文件。
target
和max_size
等参数由Boost.Log中实现的文件收集器解释,由sinks::file::make_collector
创建。如果您实现自己的收集器,则必须以自己的方式初始化它 - 可能通过将这些参数传递给收集器构造函数。