11

我正在使用提升 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;
}
4

1 回答 1

11

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

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

为了使这个答案不那么依赖这里的链接是它在报告中解决的方式:

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

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

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity");
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
于 2013-08-02T11:01:09.640 回答