Boost Log:配置文件过滤命名作用域无效,是否需扩展解析?
Boost Log 命名作用域过滤配置问题解答
问题描述
项目中使用Boost Log,希望通过配置文件过滤控制台接收器中感兴趣的命名作用域。已添加命名作用域属性:
BOOST_LOG_ATTRIBUTE_KEYWORD(scope_attr, "Scope", boost::log::attributes::named_scope::value_type) boost::log::core::get()->add_global_attribute("Scope", boost::log::attributes::named_scope());代码中使用
BOOST_LOG_NAMED_SCOPE宏,并通过boost::log::init_from_stream加载配置:[Core] DisableLogging = false Filter = "%Severity% >= DEBUG" [Sinks.1] Destination = Console Format = "[%Severity%] [%TimeStamp%] [%Scope%] [%Tag%]: %Message%" Filter = "%Scope% = \"TargetScope\" & %Severity% >= DEBUG" [Sinks.2] Destination = TextFile FileName = textfile.log AutoFlush = true Format = "[%Severity%] [%TimeStamp%] [%Scope%] [%Tag%]: %Message%"未启用过滤时,Scope属性正常显示,作用域间以"->"分隔,存在仅显示TargetScope的日志;但启用过滤后无任何日志输出。请问默认是否支持命名作用域过滤,还是需要为过滤解析系统编写扩展?
解答
默认支持命名作用域过滤,问题出在你的过滤规则写法错误:
Scope属性的实际类型是boost::log::attributes::named_scope::value_type,本质是作用域栈(嵌套作用域的列表),不是单个字符串。直接用%Scope% = "TargetScope"会尝试把整个作用域栈和单个字符串做相等匹配,自然不会命中任何日志。
你可以通过以下两种修正方式实现目标过滤:
方式1:使用contains操作符(Boost Log 1.62+支持)
直接检查作用域栈中是否包含目标名称:
Filter = "%Scope% contains \"TargetScope\" & %Severity% >= DEBUG"
方式2:遍历作用域栈元素(兼容更早版本)
通过遍历作用域栈的元素,匹配目标名称:
Filter = "exists(%Scope%[*].name == \"TargetScope\") & %Severity% >= DEBUG"
额外说明
- 如果需要精确匹配**最内层(栈顶)**的作用域,可以用
%Scope%[-1].name == "TargetScope",其中-1表示取作用域栈的最后一个元素。 - 确认你的Boost Log版本支持对应语法,比如
contains是较新版本引入的特性。
内容的提问来源于stack exchange,提问作者CaTo
相关产品推荐
相关产品推荐

