Boost事件日志不会正确显示事件

时间:2016-05-09 14:26:31

标签: c++ boost event-viewer

我对boost事件记录器有一些问题。当我尝试使用BOOST_LOG_TRIVIAL登录事件日志时,我在事件查看器中没有严重性。 (一切都显示为信息,但不显示为警告,错误等。)boost库动态链接到应用程序。我使用的是1.57版本的库。

这是截图。每个事件都应显示为警告但不是Event log view

这是我的初始代码:

try
{
    boost::log::add_common_attributes(); //edit
    boost::shared_ptr<sink_t> sink(new sink_t
        (
        log_name = "test_app",
        log_source = "test_app"
        ));

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

    sinks::event_log::custom_event_type_mapping<MessageSeverity> mapping("Severity");
    mapping[MessageSeverity::error] = sinks::event_log::error;
    mapping[MessageSeverity::warning] = sinks::event_log::warning;
    mapping[MessageSeverity::info] = sinks::event_log::info;

    sink->locked_backend()->set_event_type_mapper(mapping);
    core::get()->add_sink(sink);
}
catch (const std::exception &e)
{
    BOOST_LOG_TRIVIAL(fatal) << e.what();
}

以下是我记录事件的方式

void Logger::log(MessageSeverity severity, const std::string & msg)
{
    switch (severity)
    {
    case MessageSeverity::info:
        BOOST_LOG_TRIVIAL(info) << msg;
        break;

    case MessageSeverity::warning:
        BOOST_LOG_TRIVIAL(warning) << msg;
        break;

    case MessageSeverity::error:
        BOOST_LOG_TRIVIAL(error) << msg;
        break;

    default:
        break;
    }
}

2 个答案:

答案 0 :(得分:2)

BOOST_LOG_TRIVIAL会发出严重级别为boost::log::trivial::severity_level的日志记录。这是您应该在custom_event_type_mapping中预期的属性值类型,而不是MessageSeverity。由于类型不匹配,因此库无法从日志记录中提取严重性级别,并使用sinks::event_log::info作为映射事件类型作为后备。

您应该在事件类型映射器中使用boost::log::trivial::severity_level,或者使用专用于MessageSeverity的{​​{3}}。

boost::log::sources::severity_logger< MessageSeverity > lg;
BOOST_LOG_SEV(lg, MessageSeverity::warning) << "Hello, warning.";

答案 1 :(得分:0)

您是否尝试将日志级别注册到严重性属性?

这就是我要用的:

 #include <boost/log/expressions.hpp>
 ...
 BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", MessageSeverity);

此外,您的日志记录调用仍在使用提升严重性级别。

像下面这样更新它(/!\ Untested):

void Logger::log(MessageSeverity severity, const std::string & msg)
{
     switch (severity)
     {
      case MessageSeverity::info:
      case MessageSeverity::warning:
      case MessageSeverity::error:
         BOOST_LOG_TRIVIAL(severity) << msg;
      default:
       break;
     }
}