Boost.Log - 日志消息被意外过滤掉
Boost.Log - Log messages are unexpectedly filtered out
我正在尝试按可配置的严重级别创建过滤器。我写了以下过滤器 class:
class FilterBySeverity
{
public:
FilterBySeverity(boost::log::trivial::severity_level logLevel) :
m_logLevel(logLevel),
m_severityAttributeName("Severity")
{
}
bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
{
auto it = attrs.find(m_severityAttributeName);
if (it == attrs.end()) return true;
return it->second.extract<int>() >= m_logLevel;
}
private:
const boost::log::trivial::severity_level m_logLevel;
const boost::log::attribute_name m_severityAttributeName;
};
然后我初始化日志如下:
auto sink = boost::log::add_console_log(std::cout);
sink->set_filter(FilterBySeverity(logOptions.m_severity));
sink->locked_backend()->auto_flush(true);
那我做测试输出:
BOOST_LOG_TRIVIAL(info) << "Logging started.";
但是我看不到我的消息。但是当我注释掉对 set_filter() 的调用时,会出现消息。 logOptions.m_severity 的值为 0,即应允许所有消息。试图在 operator() 中设置断点并检查发生了什么 - 它似乎工作正常。
我做错了什么?
问题是您尝试提取的属性值类型不正确。您将类型明确指定为 int
,而 BOOST_LOG_TRIVIAL
使用的记录器使用 boost::log::trivial::severity_level
。在这种情况下,extract
调用的结果是一个空的 value_ref
实例,在任何比较运算符上 returns false
。
编写过滤器的一种更好更正确的方法是使用属性关键字,它同时处理属性名称及其值类型。由于您使用的是简单的日志记录 API,库中已经定义了一个关键字,该关键字对应于名为 "Severity" 的属性,该属性的值类型为 boost::log::trivial::severity_level
:boost::log::trivial::severity
.
bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
{
// returns an empty value_ref if the attribute value is not found
// or has a different type
auto sev = attrs[boost::log::trivial::severity];
return !sev || sev >= m_logLevel;
}
我正在尝试按可配置的严重级别创建过滤器。我写了以下过滤器 class:
class FilterBySeverity
{
public:
FilterBySeverity(boost::log::trivial::severity_level logLevel) :
m_logLevel(logLevel),
m_severityAttributeName("Severity")
{
}
bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
{
auto it = attrs.find(m_severityAttributeName);
if (it == attrs.end()) return true;
return it->second.extract<int>() >= m_logLevel;
}
private:
const boost::log::trivial::severity_level m_logLevel;
const boost::log::attribute_name m_severityAttributeName;
};
然后我初始化日志如下:
auto sink = boost::log::add_console_log(std::cout);
sink->set_filter(FilterBySeverity(logOptions.m_severity));
sink->locked_backend()->auto_flush(true);
那我做测试输出:
BOOST_LOG_TRIVIAL(info) << "Logging started.";
但是我看不到我的消息。但是当我注释掉对 set_filter() 的调用时,会出现消息。 logOptions.m_severity 的值为 0,即应允许所有消息。试图在 operator() 中设置断点并检查发生了什么 - 它似乎工作正常。 我做错了什么?
问题是您尝试提取的属性值类型不正确。您将类型明确指定为 int
,而 BOOST_LOG_TRIVIAL
使用的记录器使用 boost::log::trivial::severity_level
。在这种情况下,extract
调用的结果是一个空的 value_ref
实例,在任何比较运算符上 returns false
。
编写过滤器的一种更好更正确的方法是使用属性关键字,它同时处理属性名称及其值类型。由于您使用的是简单的日志记录 API,库中已经定义了一个关键字,该关键字对应于名为 "Severity" 的属性,该属性的值类型为 boost::log::trivial::severity_level
:boost::log::trivial::severity
.
bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
{
// returns an empty value_ref if the attribute value is not found
// or has a different type
auto sev = attrs[boost::log::trivial::severity];
return !sev || sev >= m_logLevel;
}