我一直在尝试让 Boost Log 库使用以下配置文件:
boost::log::init_from_stream();
方法。我用:
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)
注册严重性的方法,但这似乎没有任何作用。当我运行代码时,我得到以下输出:
1.[] 常规消息
2.[] 警告严重性消息
3.[] 错误严重性消息
即严重性缺失。当我添加这行代码时:
boost::log::register_simple_formatter_factory< severity_level, char >("Severity");
它按预期工作,即它按上述方式记录,但具有严重性级别。但是,当我尝试在配置文件中按严重性过滤时,它不起作用,并且没有任何内容写入文件,这意味着过滤器不知道“严重性”是什么,因此没有记录与此过滤器匹配。
如何让 Boost Log 使用 init_from_stream 方法处理严重性和过滤严重性?
这是完整的源代码:(改编自 Andrey Semashev,http ://boost-log.sourceforge.net/libs/log/example/doc/tutorial_filtering.cpp )
enum severity_level
{
normal,
notification,
warning,
error,
critical
};
std::ostream& operator<< (std::ostream& strm, severity_level level)
{
static const char* strings[] =
{
"normal",
"notification",
"warning",
"error",
"critical"
};
if (static_cast< std::size_t >(level) < sizeof(strings) / sizeof(*strings))
strm << strings[level];
else
strm << static_cast< int >(level);
return strm;
}
BOOST_LOG_ATTRIBUTE_KEYWORD(line_id, "LineID", unsigned int)
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)
int main(int, char*[])
{
logging::add_common_attributes();
// boost::log::register_simple_formatter_factory< severity_level, char >("Severity"); // when commented out severities are not shown in the log file
std::ifstream configFile_l("config.ini");
boost::log::init_from_stream(configFile_l);
src::severity_logger< severity_level > lg_l;
BOOST_LOG_SEV(lg_l, normal) << "A regular message";
BOOST_LOG_SEV(lg_l, warning) << "A warning severity message";
BOOST_LOG_SEV(lg_l, error) << "An error severity message";
return 0;
}
配置文件如下所示:
[汇.满]
目的地=文本文件
文件名=full.log
格式="%LineID%.[%Severity%] %Message%"
Filter="%Severity% > 3" # 也试过 Filter="%Severity% > info/error etc...