繁体   English   中英

提升日志 - 处理断电情况

[英]boost log - handling power off scenario

我已经使用 boost 1.63 实现了一个全局记录器。 这里是初始化:

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt< severity_level >)
{
    typedef sinks::synchronous_sink< sinks::text_file_backend > file_sink;
    boost::shared_ptr< file_sink > sink(new file_sink(
    keywords::file_name = "/var/log/testApp/%Y%m%d_%H%M%S_testApp.log",
    keywords::rotation_size = 5 * 1024 * 1024,
    keywords::auto_flush = true));

    sink->locked_backend()->set_file_collector(sinks::file::make_collector(
    keywords::target = "/var/log/testApp/oldLogs",
    keywords::max_size = 5 * 1024 * 1024 * 2,
    keywords::min_free_space = 5 * 1024 * 1024 * 2,
    keywords::max_files = 2));

    sink->locked_backend()->scan_for_files();

    sink->set_formatter(
    expr::format("[%1%]<%2%> : %3%") %
    expr::attr< boost::posix_time::ptime >("TimeStamp") %
    expr::attr< severity_level >("Severity") %
    expr::smessage);

    logging::core::get()->add_sink(sink);
    logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());

    src::severity_logger_mt< severity_level > slg;
    return slg;
}

当程序意外完成时(例如 sudo kill -9 pid 或 power off),日志文件不会移动到 oldLogs 目录(再次运行程序时)并且 /var/log/testApp 目录可能包含许多日志文件。

是否有可能处理这种情况?

是否有可能处理这种情况?

只能用离线方式。 例如,您可以在下次启动时自动运行一个脚本,将写入一半的日志文件移动到目标目录。 或者您可以在下次应用程序启动时执行此操作。 在这种情况下,如果您以追加模式打开日志文件(即通过将keywords::open_mode = std::ios::app命名参数传递给接收器构造函数),然后立即在接收器后端调用rotate_file ,则rotate_file可以为您提供帮助. 这样,非空日志文件将在您的应用程序启动时轮换,尽管您将无法实际附加到日志文件。

更新:

我注意到您在日志文件名中使用了时间戳。 在这种情况下,使用 Boost.Log 轮换日志文件的方法将不起作用,因为该库可能会在您的应用程序下次启动时打开一个不同名称的文件。 如果时间戳是必不可少的,那么剩下的唯一选择就是脚本。

除了安德烈·塞马舍夫所说的,你还需要做以下事情:

  • 从你的日志文件拖放时间戳(如keywords::file_name = "app.log" ),所以,当你使用相同的文件被打开keywords::open_mode = std::ios::app ,而是把一个时间戳只为旋转的文件(例如, keywords::target_file_name = "app_%Y%m%d_%H%M%S.log"
  • 在调用rotate_file()之前,如果您的应用程序刚刚启动,您需要记录一些内容,否则不会发生任何事情,因为日志文件尚未打开。
  • 你应该设置keywords::enable_final_rotation = false所以如果你没有关闭你的机器和应用程序的power off ,那么你不要旋转,因为你会在下次启动时这样做 - 事实上rotate_file()会旋转non-empty日志无关紧要,因为您首先需要为要打开的日志文件记录一些内容,以便rotate_file()首先起作用,这是一种永远不会发生的情况。

有关更多详细信息,请检查问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM