将 boost::log 用于具有额外“channel”和“id”属性的多线程应用程序的最佳方法是什么

JQ.*_*JQ. 5 c++ logging boost

我想将多线程应用程序登录到控制台和文件,日志行应如下所示:

2011-07-18 14:48:51.849 100 核心 W:消息

  1. 100 是唯一标识
  2. 'CORE' 是一个通道,我可以有更多的通道,例如 DATA、NETWORK。
  3. '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”,这有点进退两难,谁能帮忙?

Ano*_*ous 0

我在这里看到一些问题:

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”。希望有帮助!