You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

boost::log自定义sink的consume()获取severity值及属性过滤问题

问题1:无法提取severity属性值

问题原因

你初始化severity_logger时使用的模板参数是boost::log::trivial::severity_level枚举类型,日志记录中存储的Severity属性实际类型就是这个枚举,而非原生unsigned int,直接调用extract<unsigned int>()会因为类型不匹配抛出异常。

解决方法

先用trivial模块自带的severity属性关键字提取枚举值,再强转为unsigned int即可,修改consume方法中的相关代码:

void consume(logging::record_view const& rec)
{
    unsigned int sev = 0;
    std::string message = *rec[boost::log::expressions::smessage];
    // 用trivial模块预定义的关键字提取severity
    if (auto sev_ref = rec[logging::trivial::severity]) {
        sev = static_cast<unsigned int>(*sev_ref);
    }
    SomeLogChannel(sev, message);
}

问题2:自定义Verbosity属性过滤失效

问题原因

Boost.Log的过滤逻辑是在日志记录创建阶段执行的,早于日志消息内容的组装。你通过boost::log::add_value操纵符注入的Verbosity属性,是在日志记录已经创建完成、消息组装阶段才附加到记录上的,过滤执行时该属性还不存在,会被判定为不满足过滤条件,导致所有日志被过滤。另外你代码中前两条直接使用BOOST_LOG_SEV的日志根本没有附加Verbosity属性,也会被过滤规则拦截。

解决方法

修改过滤规则,兼容Verbosity属性不存在的场景,可以选择以下两种方式之一:

  1. 无Verbosity属性的日志默认通过过滤:
sink->set_filter(!attr_verbosity || (attr_verbosity > tVerbosity::eSilent));
  1. 无Verbosity属性的日志使用默认值参与过滤:
// 没有Verbosity属性时,默认按eVerbose等级判断
sink->set_filter(attr_verbosity.or_default(tVerbosity::eVerbose) > tVerbosity::eSilent);

内容的提问来源于stack exchange,提问作者Volker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:18:03