【发布时间】:2021-03-15 06:58:53
【问题描述】:
Boost.Log 1.75.0:
我们使用产品方面的此类消息:BOOST_LOG_TRIVIAL(info) << "\tMessage"; 缩进日志并突出显示下 n 行属于一起(注意开头的“\t”)。
有没有“官方”做这样的缩进?我阅读了有关范围日志记录的信息,但正如我所见,它只是在开头和结尾添加行。
预期的结果是这样的:
[信息] - 家长信息
[info] - ____ 缩进的子消息
【问题讨论】:
Boost.Log 1.75.0:
我们使用产品方面的此类消息:BOOST_LOG_TRIVIAL(info) << "\tMessage"; 缩进日志并突出显示下 n 行属于一起(注意开头的“\t”)。
有没有“官方”做这样的缩进?我阅读了有关范围日志记录的信息,但正如我所见,它只是在开头和结尾添加行。
预期的结果是这样的:
[信息] - 家长信息
[info] - ____ 缩进的子消息
【问题讨论】:
没有用于这种格式化的内置工具,但您可以在自定义格式化程序中实现它。例如,您可以这样做:
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 操纵器),然后从格式化程序的记录中提取它。
【讨论】: