Boost日志时区

Boost Log Time Zone

本文关键字:时区 日志 Boost      更新时间:2023-10-16

我一直在学习Boost日志库

http://www.boost.org/doc/libs/develop/libs/log/doc/html/index.html

但是我一直不知道如何显示用户的时区。有一个%q和%q格式选项,看起来很有希望,但似乎不起作用(我使用msvc++ 2013)。使用这种格式"%Y-%m-%d %H:% m:%S"。%f%Q",我得到以下输出:

1 [2015-08-18 21:27:16.860724] main.cpp#11, Test App Started.

但我希望

1 [2015-08-18 21:27:16.860724-08.00] main.cpp#11, Test App Started.

解释如下:

http://www.boost.org/doc/libs/develop/libs/log/doc/html/log/detailed/expressions.html log.detailed.expressions.formatters

这是我一直在尝试的代码,还有一些注释掉的行,我也尝试过,但没有运气:

void Log::init() const
{
    boost::log::core::get()->add_global_attribute("TimeStamp", boost::log::attributes::utc_clock());
//  boost::log::core::get()->add_global_attribute("TimeStamp", boost::log::attributes::local_clock());
    boost::log::register_simple_formatter_factory<Severity, char>("Severity");
//  boost::log::register_formatter_factory("TimeStamp", boost::make_shared<timestamp_formatter_factory>());
    boost::log::add_common_attributes();
    boost::log::add_file_log
    (
        boost::log::keywords::file_name = "appname_%N.log", 
        boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
        boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
        boost::log::keywords::format = 
            boost::log::expressions::stream
            << boost::log::expressions::attr<unsigned>("LineID") << " "
            << "[" << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f%Q"<< "]" << " "
            << "<" << boost::log::expressions::attr<Severity>("Severity") << _NSTR(">") << _NSTR(" ")
            << boost::log::expressions::smessage
//          "%LineID% [%TimeStamp(format="%Y-%m-%d %H:%M:%S.%f%Q")%] <%Severity%>: %%Message%"
    );
    const auto severity = boost::log::expressions::attr<Severity>("Severity");
    boost::log::core::get()->set_filter
    (
        severity >= severityThreshold_
    );
}

有什么建议我可能做错了吗?

utc_clocklocal_clock都产生类型为boost::posix_time::ptime的值,该值不包含时区信息。时钟之间的差异是ptime表示的时间-根据机器上设置的时区,是UTC时间还是本地时间。格式化程序不使用%Q%q,并将它们替换为空字符串。

时区存在于boost::local_time::local_date_time类型中,%Q%q占位符将为其工作。库没有产生local_date_time的时钟属性,因此您必须自己编写一个。