2017-03-03 58 views
0

我已经使用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; 
} 

当一个程序意外地完成(例如须藤杀-9 PID或断电)日志文件没有移动到oldlogs中的目录(也当程序再次运行)和/ var/log/testApp目录可能包含许多日志文件。

是否可以处理这种情况?

回答

1

仅适用于离线方式。例如,您可以在下次启动时自动运行脚本,以将一半写入的日志文件移动到目标目录。或者你可以在下一次你的应用程序启动时做到这一点。如果以附加模式打开日志文件(即将keywords::open_mode = std::ios::app命名参数传递给接收器构造函数),然后立即在接收器后端调用rotate_file,则Boost.Log可以在此情况下提供帮助。这样,非空日志文件将在您的应用程序启动时旋转,但您将无法实际追加到日志文件。

更新:

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