【发布时间】:2018-09-06 14:43:23
【问题描述】:
我有一个日志设置,其中有两种类型的日志消息:
- 1 仅基于严重性级别
- 1 仅基于自定义标记属性
这些属性定义如下:
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", trivial::severity_level)
BOOST_LOG_ATTRIBUTE_KEYWORD(tag_attr, "Tag", std::string)
我想创建一个过滤函数,允许根据 2 个条件之一将消息添加到我的日志中(请注意,基于自定义标记属性的日志消息始终打印严重级别信息,基于trivial logger 的严重级别)。
所以我想要一个过滤器,它允许基于消息是否具有自定义标签的消息,如果没有,则基于消息的严重性。
我尝试了一个相对简单的过滤器,它执行以下操作:
sink_->set_filter(
trivial::severity >= severityLevel
|| (expr::has_attr(tag_attr) && tag_attr == "JSON" && logJson_)
);
但由于严重级别可能是 Debug、Info、Warning、Error 或 Fatal,如果级别配置为 Debug 或 Info,则过滤器会忽略自定义标记属性。
我尝试过使用 c++11 lambda,如下:
sink_->set_filter([this, severityLevel](const auto& attr_set) {
if (<condition for custom tag first>) {
return true;
} else if (<condition for severity level second>) {
return true;
} else {
return false;
}
});
但是我不知道如何实际检查我的状况。我尝试了以下方法:
if (attr_set["Tag"].extract<std::string>() == "JSON" && logJson_) {
return true;
} else if (attr_set["Severity"].extract<trivial::severity_level>() >= severityLevel) {
return true;
} else {
return false;
}
但是编译器会抛出几个错误:
Core/Source/Log/Logger.cpp: In lambda function:
Core/Source/Log/Logger.cpp:127:48: error: expected primary-expression before '>' token
if (attr_set["Tag"].extract<std::string>() == "JSON" && logJson_) {
^
Core/Source/Log/Logger.cpp:127:50: error: expected primary-expression before ')' token
if (attr_set["Tag"].extract<std::string>() == "JSON" && logJson_) {
^
Core/Source/Log/Logger.cpp:129:72: error: expected primary-expression before '>' token
} else if (attr_set["Severity"].extract<trivial::severity_level>() >= severityLevel) {
^
Core/Source/Log/Logger.cpp:129:74: error: expected primary-expression before ')' token
} else if (attr_set["Severity"].extract<trivial::severity_level>() >= severityLevel) {
^
Core/Source/Log/Logger.cpp: In lambda function:
Core/Source/Log/Logger.cpp:134:5: error: control reaches end of non-void function [-Werror=return-type]
});
^
cc1plus: all warnings being treated as errors
scons: *** [obj/release/Core/Source/Log/Logger.os] Error 1
====5 errors, 0 warnings====
我一直在搜索有关自己提取属性的 boost 日志文档,但找不到我需要的信息。
编辑:
为了后代,我将添加我是如何解决我的问题的(感谢 Andrey 给出的答案):
sink_->set_filter([this, severityLevel](const auto& attr_set) {
if (attr_set[tag_attr] == "JSON") {
return logJson_;
} else if (attr_set[severity] >= severityLevel) {
return true;
} else {
return false;
}
});
【问题讨论】: