微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost Log V2 中的缩进消息

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?