【问题标题】:Indent message in Boost Log V2Boost Log V2 中的缩进消息
【发布时间】:2021-03-15 06:58:53
【问题描述】:

Boost.Log 1.75.0:

我们使用产品方面的此类消息:BOOST_LOG_TRIVIAL(info) << "\tMessage"; 缩进日志并突出显示下 n 行属于一起(注意开头的“\t”)。

有没有“官方”做这样的缩进?我阅读了有关范围日志记录的信息,但正如我所见,它只是在开头和结尾添加行。

预期的结果是这样的:

[信息] - 家长信息

[info] - ____ 缩进的子消息

【问题讨论】:

    标签: c++ boost boost-log


    【解决方案1】:

    没有用于这种格式化的内置工具,但您可以在自定义格式化程序中实现它。例如,您可以这样做:

    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 操纵器),然后从格式化程序的记录中提取它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多