如何为Boost Trivial Log默认级别自定义Severity显示文本?
解决Boost Trivial Log默认级别自定义显示文本的问题
要保留默认的trivial::severity_level枚举,同时修改其输出文本,不推荐直接重载operator<<(因为Boost已提供该运算符,参数依赖查找会优先调用Boost版本,导致自定义重载失效),更稳妥的方式是在格式化器中通过映射函数实现级别到自定义字符串的转换。
实现步骤
1. 自定义级别映射逻辑
在格式化器中使用lambda或独立函数,将默认级别映射为你需要的短字符串:
方式一:使用Lambda表达式(简洁)
直接在格式化器中嵌入映射逻辑,无需额外函数:
boost::log::formatter formatter = boost::log::expressions::stream << boost::phoenix::bind([](boost::log::trivial::severity_level level) { switch(level) { case boost::log::trivial::trace: return "trace"; case boost::log::trivial::debug: return "debug"; case boost::log::trivial::info: return "info"; case boost::log::trivial::warning: return "warn"; // 替换为短名称 case boost::log::trivial::error: return "error"; case boost::log::trivial::fatal: return "fatal"; default: return "unknown"; } }, boost::log::trivial::severity) << " " << boost::log::expressions::smessage;
方式二:使用独立映射函数(便于复用)
如果需要在多个地方复用映射逻辑,可定义独立函数:
#include <string> #include <boost/log/trivial.hpp> std::string severity_to_short_name(boost::log::trivial::severity_level level) { switch(level) { case boost::log::trivial::trace: return "trace"; case boost::log::trivial::debug: return "debug"; case boost::log::trivial::info: return "info"; case boost::log::trivial::warning: return "warn"; case boost::log::trivial::error: return "error"; case boost::log::trivial::fatal: return "fatal"; default: return "unknown"; } }
然后在格式化器中调用该函数:
boost::log::formatter formatter = boost::log::expressions::stream << boost::phoenix::bind(&severity_to_short_name, boost::log::trivial::severity) << " " << boost::log::expressions::smessage;
2. 应用格式化器到日志输出
将自定义格式化器绑定到控制台或文件输出,示例如下:
#include <boost/log/core.hpp> #include <boost/log/utility/setup/console.hpp> int main() { // 配置控制台输出并应用自定义格式化器 boost::log::add_console_log( std::cout, boost::log::keywords::formatter = formatter // 这里的formatter是上面定义的格式化器 ); // 测试日志输出 BOOST_LOG_TRIVIAL(warning) << "Some log"; // 输出:warn Some log return 0; }
为什么重载operator<<会失败?
Boost已经在boost::log::trivial命名空间中为severity_level提供了默认的operator<<实现。如果在全局命名空间重载该运算符,参数依赖查找(ADL)会优先匹配Boost的版本,导致你的自定义重载无法被调用。虽然可以尝试在boost::log::trivial命名空间中重载,但这违反了C++的命名空间使用规范,且可能与Boost的后续版本冲突,因此不建议这么做。
内容的提问来源于stack exchange,提问作者codentary
相关产品推荐
相关产品推荐

