【问题标题】:Boost Log: Interaction of log settings file and code configurationBoost Log:日志设置文件和代码配置的交互
【发布时间】:2015-08-25 14:11:50
【问题描述】:

我有一个不错的格式和控制台日志:

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

boost::log::add_console_log(std::cout, keywords::format = fmtStream);

格式流当然要长一些.. 现在我想给用户配置日志:

std::ifstream file("log.conf");
init_from_stream(file);

fmtStream 中使用的很多格式都不能使用配置文件中的格式字符串。

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

我看到的可能性:

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

2) 设置所有接收器采用的默认格式。但根据Boost Log changing the default logging::core formatter?,这是不可能的。

3) 还有其他想法吗?

谢谢!

【问题讨论】:

    标签: c++ logging boost boost-log boost-logging


    【解决方案1】:

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

    您可以使用parse_settings 函数解析设置文件。从中您将收到一个settings(或wsettings)对象,您可以按照herehere 的描述对其进行分析和修改(对于参考文档中的错误格式感到抱歉)。由于您可能不打算支持 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
    }
    

    现在,要将此格式字符串转换为格式化程序,您将需要parse_formatter 函数(字符串格式描述为here)。此函数返回一个格式化程序对象,您可以将其安装到您的接收器中,前提是您保存了一个指向它的指针。

    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()));
    }
    

    不过,还有一件事要记住。如果您在格式化程序中使用自定义类型的属性值,例如用于严重性的枚举,则必须在解析格式化程序之前在库中注册这些类型。这样,解析器将能够创建一个知道您的类型并使用适当的格式化运算符的格式化程序。有一个 tutorial 描述了如何做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多