我想将多线程应用程序登录到控制台和文件,日志行应如下所示:
2011-07-18 14:48:51.849 100 核心 W:消息
目前我尝试过,大致:
boost::log::sources::severity_logger< Severity > sevlogger;
enum Channel{Core, ...};
attrChannel.reset(new boost::log::attributes::mutable_constant< Channel >(Core));
boost::log::core::get()->add_global_attribute( "Channel", *attrChannel);
...
//similar to id
...
//file sink:
typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_file_backend > FileSinkType;
fileSink.reset( new FileSinkType( boost::log::keywords::file_name = fileName ));
fileSink->locked_backend()->set_formatter( format );
boost::log::core::get()->add_sink( fileSink );
...
//similar thing for console sink
...
//LOG Macro
#define LOG( ch, message )\
{\
if( ::Logging::initialized )\
{\
boost::mutex::scoped_lock _(::Logging::loggerMutex);\
unsigned int logID = ::Logging::IncrementLogID();\
::Logging::attrChannel->set(::Logging::ch);\
::Logging::attrLogID->set( logID );\
BOOST_LOG_STREAM_WITH_PARAMS((::Logging::sevlogger),\
(::boost::log::keywords::severity = ::Logging::sev )) << message;\
tls->logID = logID;\
tls->channel = ::Logging::ch;\
}\
}
Run Code Online (Sandbox Code Playgroud)
似乎“锁定互斥锁”是一个瓶颈,因为我有多个线程同时进行日志记录,但我需要锁定才能拥有唯一的“日志 ID”,这有点进退两难,谁能帮忙?
我在这里看到一些问题:
1.) 声明您自己的 LOG-Makro
如果更改严重级别会怎样?在这种情况下,您可能会增加日志 ID,但不会使用实际的日志条目,因为可能会过滤掉适当的严重性级别。这也会在记录时造成一点开销,因为什么都不应该做,但您仍然调用“IncrementLogID”、set(ID)、set(channel) 等。
2.)回答(希望)你的问题
我遇到了类似的问题:我想使用和过滤不同的模块名称,或者如您所说的“通道”。将其添加到您的流格式中:
<< "[" << expr::attr< std::string >("Channel")<< "] "
Run Code Online (Sandbox Code Playgroud)
在属于“Core”的源文件之一的函数开头像这样使用它:
BOOST_LOG_SCOPED_THREAD_ATTR("Channel", attrs::constant< std::string >("Core"));
Run Code Online (Sandbox Code Playgroud)
当然,您可以用枚举替换“std::string”,用枚举值替换“Core”。希望有帮助!