什么是使用boost :: log进行多线程应用程序的最佳方式,具有额外的'channel'和'id'属性

时间:2011-07-29 09:43:30

标签: c++ boost logging

我想在多线程应用程序中登录控制台和文件,日志记录行应该是:

  

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

  1. 100是唯一ID
  2. 'CORE'是一个频道,我可以拥有更多频道,例如DATA,NETWORK。
  3. 'W'表示警告
  4. 目前我大致尝试过:

    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',这里有点困境,谁可以帮忙?

1 个答案:

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