我想在多线程应用程序中登录控制台和文件,日志记录行应该是:
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;\
}\
}
似乎'锁定互斥锁'是一个 瓶颈 ,因为我有很多线程同时登录,但我需要锁定才能拥有唯一的'log id',这里有点困境,谁可以帮忙?
答案 0 :(得分:0)
我在这里看到一些问题:
1.)声明自己的LOG-Makro
如果更改严重性级别怎么办?在这种情况下,您可以增加日志ID,但不使用实际日志条目,因为可能会过滤掉适当的严重性级别。这也会在记录时产生一些开销,因为没有任何事情要做,但你仍然会调用“IncrementLogID”,设置(ID),设置(通道)等。
2。)回答(希望如此)你的问题
我遇到了类似的问题:我想使用和过滤不同的模块名称,或者当你称之为“渠道”时。将其添加到您的流格式:
<< "[" << expr::attr< std::string >("Channel")<< "] "
在属于“Core”的一个源文件中的函数开头使用它:
BOOST_LOG_SCOPED_THREAD_ATTR("Channel", attrs::constant< std::string >("Core"));
当然你可以用枚举替换“std :: string”,用枚举值替换“Core”。希望有所帮助!