提升日志text_file_backend性能

时间:2016-10-14 04:09:50

标签: performance boost rotation backend boost-log

我正在使用boost日志,我选择了text_file_backend,但性能不佳。无论是同步还是异步,升压日志的性能都很低。大约在6秒内,它将30M数据写入日志文件。 关注是我的代码段,任何人都可以帮助我吗?

    typedef boost::log::sinks::asynchronous_sink<
      boost::log::sinks::text_file_backend> TextSink; 
    boost::log::sources::severity_logger_mt<LogSev> logger_;
    boost::shared_ptr<TextSink> report_sink_;

    // initialize report_sink
    boost::shared_ptr<sinks::text_file_backend> report_backend =
        boost::make_shared<sinks::text_file_backend>(
            keywords::file_name = target + "/" + file_name
                + ".report.log.%Y_%m_%d.%N",
            keywords::rotation_size = file_size, keywords::time_based_rotation =
                sinks::file::rotation_at_time_point(0, 0, 0),
            keywords::auto_flush = false);

    boost::shared_ptr<sinks::file::collector> report_collector = CreateCollector(
        target, max_use_size / 2, min_free_size);
    report_backend->set_file_collector(report_collector);
    report_backend->scan_for_files();

    // add sink: report_sink
    report_sink_ = boost::make_shared<TextSink>(report_backend);
    report_sink_->set_formatter(
        expr::format("[%1%]" + sep + "[%2%]" + sep + "[%3%]" + sep + "%4%")
            % expr::format_date_time<boost::posix_time::ptime>(
                "TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
            % expr::attr<LogSev>("Severity")
            % expr::attr<attrs::current_thread_id::value_type>("ThreadID")
            % expr::message);
    report_sink_->set_filter(expr::attr<LogSev>("Severity") >= report);
    logging::core::get()->add_sink(report_sink_);

    logging::add_common_attributes();

    BOOST_LOG_SEV(logger_, info) << "blabal...";

1 个答案:

答案 0 :(得分:0)

我认为与您的实现有关的一个性能问题与Timestamp有关。需要系统调用才能找到时间。我遇到了同样的问题。所以我转向使用date库。它非常快速地返回UTC时间。还要检查this问题的第一个答案,但是,如果要基于时区的时间戳记,则日期库很慢。您最好定义自己的时区并添加到UTC。

请参见示例:

#include "date.h"

#define MY_TIME std::chrono::hours(4) + std::chrono::minutes(30)

string timestamp = date::format("%F %T", std::chrono::system_clock::now() + 
                                MY_TIME);