配置Boost.日志v2



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

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

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

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

等等…

更新

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

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

接收器->set_formatter(&coloring_formatter(;

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

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

谢谢

在另一个答案中描述了创建一个支持着色的格式化程序,这里我将重点介绍如何将该格式化程序合并到设置文件中。

助推。Log支持通过注册接收器工厂来扩展其设置文件解析器,您可以在您的情况下使用它。由于可以重用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实现的详细信息,请参阅我前面提到的答案。

最新更新