使用BOOST_LOG_SEV打印日志无法正确输出自定义严重级别如何解决
问题根因
你遇到的两个问题分别对应两个不同的配置错误:
- 自定义日志级别始终显示info:你自定义了
severity_level枚举,但没有为Boost.Log的格式化器注册该枚举的输出逻辑,Boost.Log无法识别你自定义的级别值,默认统一输出info - 替换为
trivial::severity_level编译报错:你的logger实例slg绑定的是你自定义的severity_level类型,和Boost.Log内置的trivial::severity_level是完全独立的两个枚举类型,类型不匹配自然无法转换
解决方案
方案1:继续使用自定义severity_level枚举
你需要为自定义级别添加输出运算符重载,并且在初始化sink的格式化器时指定读取自定义级别的属性:
- 在你自定义枚举的代码后添加输出重载和属性注册:
enum severity_level { trace, debug, info, warning, error, fatal }; // 新增以下内容 std::ostream& operator<<(std::ostream& os, severity_level level) { static const char* level_strs[] = { "trace", "debug", "info", "warning", "error", "fatal" }; if (static_cast<std::size_t>(level) < std::size(level_strs)) os << level_strs[level]; else os << static_cast<int>(level); return os; } // 注册到Boost.Log表达式系统 BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level) inline boost::log::sources::severity_logger<severity_level> slg;
- 修改你日志sink的格式化配置,使用自定义的severity关键字:
// 仅需替换你原有格式化器中级别对应的字段即可,示例如下 sink->set_formatter( boost::log::expressions::stream << "[" << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") << "]" << "[" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" << "[" << severity << "]" // 此处用你注册的自定义severity关键字 << boost::log::expressions::smessage );
方案2:直接使用Boost.Log内置的trivial::severity_level
如果你不需要自定义级别规则,直接替换你自定义的枚举和logger声明即可,无需额外的格式化注册,原有日志打印逻辑完全不用修改:
// 删除你自己定义的severity_level枚举,替换为以下内容 using severity_level = boost::log::trivial::severity_level; inline boost::log::sources::severity_logger<severity_level> slg;
该方案下编译错误会直接消失,内置的trivial级别自带默认格式化规则,可直接正确输出各级别名称。
内容的提问来源于stack exchange,提问作者There is nothing we can do
相关产品推荐
相关产品推荐

