如何解决Boost Log V2 中的缩进消息
Boost.Log 1.75.0:
我们使用product-wise这样的消息:BOOST_LOG_TRIVIAL(info) << "\tMessage";
来缩进日志并突出显示下n行属于一起(注意开头的“\t”)。
有没有“官方”可以做这样的缩进?我阅读了范围日志记录,但在我看来,它只是在开头和结尾添加行。
预期的结果是这样的:
[信息] - 家长信息
[信息] - ____ 缩进的子消息
解决方法
没有用于这种格式化的内置工具,但您可以在自定义格式化程序中实现它。例如,您可以这样做:
thread_local unsigned int g_indent = 0u;
std::string indent_formatter()
{
return std::string(g_indent,'_');
}
sink->set_formatter(boost::log::expressions::stream
<< boost::phoenix::bind(&indent_formatter) << " " << boost::log::expressions::smessage);
这里,您需要使用 boost::phoenix::bind
使 indent_formatter
成为 Boost.Phoenix 表达式,以便它与它所属的格式化表达式兼容。还有其他编写自定义格式化程序的方法,包括将其编写为 single function。
现在,当您需要更改缩进级别时,只需更新 g_indent
。编写一个范围保护类来自动执行此操作很有用:
class auto_indent_level
{
public:
auto_indent_level() noexcept { ++g_indent; }
~auto_indent_level() { --g_indent; }
auto_indent_level(auto_indent_level const&) = delete;
auto_indent_level& operator= (auto_indent_level const&) = delete;
};
void bar()
{
auto_indent_level ail;
BOOST_LOG_TRIVIAL(info) << "bar()"; // indented one level
}
void foo()
{
BOOST_LOG_TRIVIAL(info) << "foo()"; // not indented
bar();
}
请注意,这不适用于 asynchronous 日志记录,因为在这种情况下日志记录格式化发生在不同的线程中。如果您需要它来处理异步日志记录,那么您需要将 g_indent
附加到日志记录记录(例如,使用 add_value
操纵器),然后从格式化程序中的记录中提取它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。