【问题标题】:Boost log severity_logger init_from_stream提升日志severity_logger init_from_stream
【发布时间】:2013-08-03 13:45:16
【问题描述】:

我正在使用 boost 1.54.0。 您可以在下面找到说明我的问题的最小示例。

我使用boost log的severity_logger。 我想从流中配置我的接收器。 (在下面的例子中,我使用了一个字符串流。 在我的实际应用程序中,流来自文件。) 我想将 %Severity% 用于输出或过滤目的。

我的问题是:如果我按照下面的示例使用它,%Severity% 是空的。

%LineID% 和 %Message% 已按预期填充。 如果我按照注释行中给出的方式设置接收器,它会按预期工作。

有什么想法吗?

#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/expressions.hpp>

enum SeverityLevel { trace, fatal };

int main (int argc, char *argv[])
{
    boost::log::add_common_attributes();
    /*
    struct severity_tag;
    boost::log::add_console_log(std::clog,
        boost::log::keywords::format = (
            boost::log::expressions::stream
                << boost::log::expressions::attr< unsigned int >("LineID")
                << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity")
                << "> " << boost::log::expressions::smessage)
    ); */

    std::stringstream s;
    s << "[Sinks.MySink]" << std::endl;
    s << "Destination=Console" << std::endl;
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl;
    boost::log::init_from_stream(s);

    boost::log::sources::severity_logger<SeverityLevel> lg;
    BOOST_LOG_SEV(lg, trace) << "This is a trace message";
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message";
    return 0;
}

【问题讨论】:

  • 您需要指示 Boost Log 实际使用 Sinks.MySink。遗憾的是,我对 Boost Log 配置没有经验
  • 这不是问题。它正在使用 MySink。我提供的格式按需要使用。例外:%Severity% 被空字符串替换。它应该是枚举值的数量。它适用于接收器配置的注释方式。

标签: c++ logging boost boost-log


【解决方案1】:

你是对的。这是一个已知错误,已在当前开发版本中修复。

这是错误报告:https://svn.boost.org/trac/boost/ticket/8840

为了减少这个答案对链接的依赖,在报告中解决了这个问题:

在解析设置文件之前,您需要在库中注册您的严重性属性。见here。如果要根据严重性级别过滤记录,则可能必须为格式化程序和过滤器解析器注册该属性。

好的,这是可行的,但我必须添加一个流输入/提取功能,然后我必须在从设置文件加载设置之前添加以下两行:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity");
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 

【讨论】:

  • 你就是那个男人。我花了 2 天的时间才偶然发现你的帖子,因为我认为我犯了一个配置错误......
  • 几年后... Boost 是 1.62 版,我在过去 2 天遇到了同样的问题。多亏了这个答案,我才能使“严重性”工作。
猜你喜欢
  • 2018-09-25
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多