我使用Boost.Log在C++中进行日志记录,并使用配置文件。我添加了一些自定义属性,并在配置文件中使用它们。以下是C++中属性的注册:
namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;
attr1 myProcessID("");
attr2 myThreadID("");
attr3 myThreadIndex("")
attr4 theCorrelationId("");
attr5 theMiscInfos("");
slg_mt::get().add_attribute("Process_ID", myProcessID);
slg_mt::get().add_attribute("Thread_ID", myThreadID);
slg_mt::get().add_attribute("Thread_Index", myThreadIndex);
slg_mt::get().add_attribute("Correlation_ID", theCorrelationId);
slg_mt::get().add_attribute("MiscInfos", theMiscInfos);
我定义了一个配置文件,并使用boost::log::init_from_stream
以正常方式初始化配置文件。
如果我使用以下配置,它运行良好:
[Sinks.TRACE]
Destination="TextFile"
Asynchronous="true"
AutoFlush="true"
Format="[TimeStamp %TimeStamp(format="%Y-%m-%d %H:%M:%S.%f")%][UpTime
%Uptime(format="%O:%M:%S.%f")%][ProcessID: %Process_ID%][ThreadID: %Thread_ID% %Thread_Index%] %Message%"
Target="C:BoostLogTrace"
FileName="C:BoostLogTraceREST_%N.log"
RotationSize="10485760"
ScanForFiles="Matching"
Filter="%Severity% = trace"
一切都很好。除了我想不仅在日志条目中,而且在日志目标和文件名中使用我的自定义属性之外。
当我尝试使用以下FileName时,它不起作用:
FileName="C:BoostLogTraceREST_%THREAD_ID%.log"
有没有一种方法可以使用自定义属性更改目标和文件名,使属性值从一个日志条目更改为另一个?
从更高的角度来看,我需要将每个单独的用户会话记录在不同的日志文件中。如何使用Boost.log执行此操作?
谢谢!
您可以使用多文件接收器后端登录到单独的文件中。该后端支持从附加到日志记录的属性生成文件名。
但是,默认情况下,不支持从配置文件进行初始化。您必须为此接收器后端注册一个工厂,并从解析的设置中配置此接收器。您可以重用过滤器和格式化程序解析器,也可以使用格式化程序解析器来构造文件名生成器。
class multifile_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)
{
boost::shared_ptr< sinks::text_multifile_backend > backend =
boost::make_shared< sinks::text_multifile_backend >();
// Read sink parameters
if (boost::optional< std::string > param = settings["FileName"])
{
backend->set_file_name_composer(sinks::file::as_file_name_composer(
logging::parse_formatter(*param)));
}
else
throw std::runtime_error("No target file name specified in settings");
typedef sinks::synchronous_sink< sinks::text_multifile_backend > sink_t;
boost::shared_ptr< sink_t > sink = boost::make_shared< sink_t >(backend);
if (boost::optional< std::string > param = settings["Filter"])
sink->set_filter(logging::parse_filter(*param));
if (boost::optional< std::string > param = settings["Format"])
sink->set_formatter(logging::parse_formatter(*param));
return sink;
}
};
logging::register_sink_factory("TextMultifile",
boost::make_shared< multifile_factory >());
然后您可以使用";文本多文件;作为";目的地";配置文件中的参数值。您可以像以前一样解析配置文件,通过调用init_from_stream
或init_from_settings
,初始化例程将调用工厂来创建和配置接收器。
请注意,text_multifile_backend
不支持日志文件旋转,因为它不跟踪生成的单个文件。如果您仍然需要文件旋转和管理旋转的文件,那么您也必须实现自己的接收器后端。