设置自定义收集器时不会提升:: log尊重关键字:: max_size吗?

时间:2018-06-14 16:08:40

标签: c++ logging boost boost-log

我正在使用Boost 1.61而我最终想要的是:

  1. 如果当前日志文件的大小达到FILE_ROTATION_SIZE
  2. ,则将其旋转
  3. 使用自定义收集器处理旋转的文件以进行进一步压缩(这是压缩旋转文件的正确方法吗?)
  4. 如果文件的总大小达到FILES_MAX_SIZE
  5. ,则删除一些最旧的(理想的压缩)文件

    现在,没有任何收藏家,只需使用以下代码段即可获得第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()回调的方法,我计划放置压缩逻辑。

    这是否意味着我应该跟踪总大小并在需要时自行处理删除?

    谢谢!

1 个答案:

答案 0 :(得分:1)

  

这是压缩旋转文件的正确方法吗?

是的,如果您必须在申请中执行此操作。请注意,除非您使用异步日志记录,否则日志文件轮换将同步完成。这意味着在压缩日志文件时,应用程序中的某些随机日志语句需要相当长的时间才能完成。

更好的解决方案可能是使用单独的服务,例如logrotate,它将处理日志轮换和压缩,而不会干扰您的应用程序性能。

  

这是否意味着我应该跟踪总大小并在需要时自行处理删除?

是的,文件收集器完全负责管理旋转的文件。每当调用store_file时,文件收集器必须执行必要的步骤以将文件压缩并存储在目标存储中,并可能删除任何旧文件。

targetmax_size等参数由Boost.Log中实现的文件收集器解释,由sinks::file::make_collector创建。如果您实现自己的收集器,则必须以自己的方式初始化它 - 可能通过将这些参数传递给收集器构造函数。