【问题标题】:Configure Boost.Log v2配置 Boost.Log v2
【发布时间】:2021-03-14 06:36:29
【问题描述】:

我正在使用 Boost.Log V2 1.75.0 并使用 boost::log::init_from_stream(config); 从配置文件设置我的环境

是否可以通过配置文件声明彩色控制台接收器,或者有什么方法可以将彩色输出添加到控制台?

现在,我添加了与 Boost Trivial Logger 中可用的日志级别一样多的控制台接收器,并按不同的级别过滤它们,但我不认为这是正确的方法。示例:

[Sinks.ConsoleSinkTrace]
Destination=Console
Filter="%Severity% = trace"
Format="\033[0;35m[%TimeStamp%] [%ProcessId%] [%ThreadId%] [%Severity%] - %Message%\033[0m"
Asynchronous=false
AutoFlush=true

[Sinks.ConsoleSinkDebug]
Destination=Console
Filter="%Severity% = debug"
Format="\033[0;34m[%TimeStamp%] [%ProcessId%] [%ThreadId%] [%Severity%] - %Message%\033[0m"
Asynchronous=false
AutoFlush=true

...等等...

更新

我找到了@AndreySemashev 建议的 SO 帖子,但我不太明白,如何将它融入我的项目中: 我的主要期望是我想通过文件配置 Boost.Log,所以:

  1. 如果我从配置文件中删除控制台接收器,如何将格式化程序设置为接收器? (我猜sink 是一个控制台类型的接收器,如果配置文件中没有这样的部分,则不会被实例化)

sink->set_formatter(&coloring_formatter);

  1. 如果我提供一个新的格式化程序方法,我假设处理配置文件中给出的整个格式字符串是我的责任。我也想避免这种情况

这些观察结果是否正确,还是我遗漏了什么?

谢谢

【问题讨论】:

标签: c++ boost boost-log


【解决方案1】:

another answer 中描述了创建具有着色支持的格式化程序,这里我将重点介绍如何将该格式化程序合并到设置文件中。

Boost.Log 支持通过registering sink factories 扩展其设置文件解析器,您可以在自己的情况下使用它。由于您可以重复使用text_ostream_backend 进行输出,因此您不必实现新的接收器,但您需要自定义其配置。

class colored_console_factory :
    public logging::sink_factory< char >
{
public:
    // Creates the sink with the provided parameters
    boost::shared_ptr< sinks::sink > create_sink(settings_section const& settings)
    {
        typedef sinks::text_ostream_backend backend_t;
        auto backend = boost::make_shared< backend_t >();

        backend->add_stream(
            boost::shared_ptr< std::ostream >(&std::clog, boost::null_deleter()));

        // Read settings and configure the backend accordingly
        if (auto auto_flush = settings["AutoFlush"])
            backend->auto_flush(*auto_flush == "1" || *auto_flush == "true");

        auto sink =
            boost::make_shared< sinks::synchronous_sink< backend_t > >(backend);

        // You can reuse filter and formatter parsers provided by Boost.Log
        if (auto filter = settings["Filter"])
            sink->set_filter(logging::parse_filter(*filter));

        if (auto format = settings["Format"])
        {
            logging::formatter fmt = logging::parse_formatter(*format);
            // Wrap the parsed formatter with coloring
            sink->set_formatter(coloring_formatter(std::move(fmt)));
        }

        return sink;
    }
};

在上面,coloring_formatter 是一个函数对象,它在输出中使用着色前缀和后缀包装已解析的格式化程序。函数对象必须具有格式化程序的标准签名。

class coloring_formatter
{
public:
    typedef void result_type;
    typedef basic_formatting_ostream< char > stream_type;

public:
    explicit coloring_formatter(logging::formatter&& fmt) :
        m_fmt(std::move(fmt))
    {}

    result_type operator() (
        logging::record_view const& rec, stream_type& strm) const
    {
        // Output coloring prefix
        auto severity = rec[logging::trivial::severity];
        if (severity)
        {
            switch (severity.get())
            {
                ...
            }
        }

        // Let the wrapped formatter produce its output
        m_fmt(rec, strm);

        // Output coloring suffix
        if (severity)
        {
            ...
        }
    }

private:
    logging::formatter m_fmt;
};

有关coloring_formatter 实现的详细信息,请参阅我之前提到的答案。

【讨论】:

  • 谢谢@AndreySemashev。我认为,将这个接收器支持添加到库中会很受欢迎。
猜你喜欢
  • 2012-03-06
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多