C++ Boost日志:日志设置文件与代码配置的交互

C++ Boost日志:日志设置文件与代码配置的交互,c++,logging,boost,boost-log,boost-logging,C++,Logging,Boost,Boost Log,Boost Logging,我有一个很好的格式和控制台日志: auto fmtStream = expressions::stream << "LineID: " << expressions::attr<unsigned int>("LineID") << " " << "Message: " << expressions::message: boost::log::add_console_log(std::cout, keywords::

我有一个很好的格式和控制台日志:

auto fmtStream = expressions::stream
  << "LineID: " << expressions::attr<unsigned int>("LineID") << " "
  << "Message: " << expressions::message:

boost::log::add_console_log(std::cout, keywords::format = fmtStream);
fmtStream中使用的许多格式无法使用配置文件中的格式字符串

如何让用户能够修改控制台接收器,例如添加过滤器?但是我想保留格式字符串作为默认值

我看到的可能性是:

1) 为我在代码中定义的控制台日志指定一个名称。用户现在可以使用相同名称的接收器对其进行修改

2) 设置所有接收器采用的默认格式。但根据这一点,这是不可能的

3) 还有其他想法吗


谢谢

init_from_stream
init_from_settings
函数将按照设置中的指定初始化库。这些函数旨在从头配置库,因此它们将添加具有指定设置的新接收器,包括过滤器和格式化程序。如果您只需要为现有接收器自定义格式化程序,而不允许完全日志记录配置,那么您应该自己解释设置文件

您可以使用函数解析设置文件。从中,您将收到一个
设置
(或
wsettings
)对象,您可以按照所述进行分析和修改(很抱歉参考文档中的格式错误)。由于您可能不打算支持Boost.Log支持的所有接收器和参数,因此您不必绑定到语义Boost.Log,因为Boost.Log将参数放入其中,并且可以以任何方式解释设置。例如,您可以选择仅读取接收器格式化程序:

boost::log::settings setts = boost::log::parse_settings(file);
if (boost::optional<std::string> fmt = setts["MySink"]["Format"])
{
    // Sink format is specified in the setting file
}
不过还有一件事要记住。如果在格式化程序中使用自定义类型的属性值,例如严重性枚举,则必须在解析格式化程序之前在库中注册这些类型。这样,解析器将能够创建一个了解您的类型并使用适当的格式化运算符的格式化程序。有一个描述如何做到这一点的例子

boost::log::settings setts = boost::log::parse_settings(file);
if (boost::optional<std::string> fmt = setts["MySink"]["Format"])
{
    // Sink format is specified in the setting file
}
auto sink = boost::log::add_console_log(std::cout, keywords::format = fmtStream);
boost::log::settings setts = boost::log::parse_settings(file);
if (boost::optional<std::string> fmt = setts["MySink"]["Format"])
{
    sink->set_formatter(boost::log::parse_formatter(fmt.get()));
}