我一直在尝试使用:
让Boost日志库与配置文件一起使用boost::log::init_from_stream();
方法。我用的是:
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)
注册Severity的方法,但这似乎没有做任何事情。当我运行代码时,我得到以下输出:
1. []常规消息
2. []警告严重性消息
3. []错误严重性消息
即。严重程度缺失。当我添加这行代码时:
boost::log::register_simple_formatter_factory< severity_level, char >("Severity");
它按预期工作,即它按上述日志记录但具有严重性级别。但是,当我尝试按配置文件中的严重性过滤时,它不起作用,并且没有任何内容写入文件,这意味着过滤器不知道“严重性”是什么,因此没有记录匹配此过滤器。
如何使用init_from_stream方法获取Boost日志以使用严重性并过滤严重性?
以下是完整的源代码:(改编自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;
}
配置文件如下所示:
[Sinks.Full]
目的地= TEXTFILE
文件名= full.log
Format =“%LineID%。[%严重性%]%讯息%”
过滤=“%严重度%&gt; 3”#还尝试了过滤器=“%严重度%&gt;信息/错误等...
答案 0 :(得分:2)
你应该添加
boost::log::register_simple_formatter_factory< severity_level, char >("Severity");
在main函数中调用add_common_attributes方法之前。 问候。
答案 1 :(得分:1)
所以答案最终来自添加:
boost::log::register_simple_formatter_factory< severity_level, char >("Severity");
正如aleksandrm8所说。
然后是错误:
‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE
通过添加以下运算符重载来解决:
template< typename CharT, typename TraitsT >
inline std::basic_istream< CharT, TraitsT >& operator>> (
std::basic_istream< CharT, TraitsT >& strm, severity_level& lvl)
{
int n = normal;
strm >> n;
if (n >= normal && n <= critical)
lvl = static_cast< severity_level >(n);
else
lvl = normal;
return strm;
}
在此处找到了http://sourceforge.net/p/boost-log/discussion/710021/thread/2b0325f8。我认为其他过滤可能需要其他运算符重载,并且可以在此处找到有关信息的信息:http://www.boost.org/doc/libs/1_55_0/libs/log/doc/html/log/extension/settings.html#log.extension.settings.adding_support_for_user_defined_types_to_the_filter_parser