我有一个很好的格式和一个控制台日志:
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)还有其他想法吗?
谢谢!
答案 0 :(得分:2)
init_from_stream
和init_from_settings
函数将按照设置中的指定初始化库。这些函数旨在从头开始配置库,因此它们将添加具有指定设置的新接收器,包括过滤器和格式化程序。如果您只需要为现有接收器自定义格式化程序而不允许完整的日志记录配置,那么您应该自己解释设置文件。
您可以使用parse_settings
功能解析设置文件。从中您将收到一个settings
(或wsettings
)对象,您可以按照here和here所述进行分析和修改(抱歉参考文档中的格式不正确) 。由于您可能不打算支持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描述了如何做到这一点。