【问题标题】:Boost Log Time Zone提升日志时区
【发布时间】:2015-08-18 22:25:26
【问题描述】:

我一直在学习 Boost Log 库

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,测试应用已启动。

但我早就料到了

1 [2015-08-18 21:27:16.860724-08.00] main.cpp#11,测试应用已启动。

如中所述:

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_
    );
}

关于我可能做错的任何建议?

【问题讨论】:

    标签: c++ boost boost-log


    【解决方案1】:

    utc_clocklocal_clock 都生成 boost::posix_time::ptime 类型的值,它们没有时区信息。时钟之间的差异是 ptime 代表的时间 - UTC 或本地时间,具体取决于机器上设置的时区。格式化程序对%Q%q 没有用处,而是用空字符串替换它们。

    时区存在于 boost::local_time::local_date_time 类型中,%Q%q 占位符将适用于它。该库没有产生local_date_time 的时钟属性,因此您必须自己编写一个。示例见here

    【讨论】:

    • 我一开始阅读就放弃了文档。例如,在设计概述中,作者在“属性和属性值”中说 - “为了启动日志记录 [?comma?],日志源必须将与日志记录 [,] 关联的所有数据 [,] 传递给日志记录核心。”除了看起来错位的逗号之外,使用的术语也不清楚。我真的需要一个更接近我正在做的事情的例子。
    • 您需要文档才能理解库,而“设计概述”部分是最好的方法。这些术语在“定义”部分中有非常清楚的定义,并在“设计概述”中进一步扩展。如果这些部分没有为您清除“属性”和“属性值”,那么(a)作者需要改进文档,(b)您需要找到一个更简单的库。
    • 我读过它,但发现它令人困惑。部分原因是缺乏适当的英语,部分原因是术语词汇表不完整。这可能是很好的代码,但如果我不能理解它,我就无法使用它。很高兴切换到不同的图书馆,但我找不到。如果我的老板给我时间,我会学的。
    • 知道其他库吗?这是我正在寻找的: 必需:1) 与 MSVC++ 一起使用 2) 输出日期/时间、严重性、位标志类别、FILELINE、文本消息 3) 用户可配置过滤 4)输出到自我维护的日志文件(不要无限期收集,在达到可配置设置之前不要擦除) 5)能够以可配置的语言输出到用户对话框 6)能够通过 http 协议输出到服务器 理想情况下:1)开源 2) 输出到操作系统日志(如果存在)。
    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多