2017-12-21 6 views
0

ログレコードのフォーマッタを設定していますが、重大度フィールドは最後のログメッセージで空になります。コードは正常にコンパイルされますが、期待どおりに動作しません。お知らせ下さい。ブーストログに関する文書は非常にわかりにくく、不明瞭です。ログメッセージにブーストログの重大度がありません

auto logFmt = (               
       boost::log::expressions::stream         
       <<boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d:%H:%M:%S") 
       <<"|"<< boost::log::expressions::attr<boost::log::trivial::severity_level>("Severity") 
       <<"|pid:"<<boost::log::expressions::attr<boost::log::process_id>("ProcessID") 
       <<"|tid:"<<boost::log::expressions::attr<boost::log::thread_id>("ThreadID") 
       <<"| "<<boost::log::expressions::smessage);   

大きな断片とは別のスタンドアロンのコードスニペットを貼り付けています。

#ifndef BOOST_LOG_USE_NATIVE_SYSLOG 
#define BOOST_LOG_USE_NATIVE_SYSLOG 
#endif 

#include <string> 
#include <fstream> 
#include <iostream> 
#include <stdexcept> 
#include <syslog.h> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/date_time/posix_time/posix_time_types.hpp> 
#include <boost/phoenix.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/basic_sink_backend.hpp> 
#include <boost/log/sinks/syslog_backend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/sources/logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/attributes/value_visitation.hpp> 
#include <boost/log/utility/manipulators/add_value.hpp> 
#include <boost/log/sinks/text_file_backend.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/attributes/timer.hpp> 
#include <boost/log/attributes/named_scope.hpp> 
#include <boost/log/support/date_time.hpp> 

#define __LOCATION_TAG__ <<__FILE__<<"|"<<__LINE__<<"|"<<__FUNCTION__<<"()|"<<" " 

#define _fatal BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::fatal)__LOCATION_TAG__ 
#define _error BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::error)__LOCATION_TAG__ 
#define _warning BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::warning)__LOCATION_TAG__ 
#define _info BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::info)__LOCATION_TAG__ 
#define _debug BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::debug)__LOCATION_TAG__ 
#define _trace BOOST_LOG_SEV(Logger::getLogger(), boost::log::v2_mt_posix::trivial::trace)__LOCATION_TAG__ 


class Logger 
{ 
    class custom_backend : 
     public boost::log::sinks::basic_sink_backend< 
     boost::log::sinks::combine_requirements< 
     boost::log::sinks::formatted_records, 
     boost::log::sinks::concurrent_feeding, 
     boost::log::sinks::flushing 
     >::type 
     > 
    { 
     public: 
      typedef char        char_type; // Character type. 
      typedef std::basic_string<char_type> string_type; // Formatted string type. 
      explicit custom_backend() 
      { 
       return; 
      } 

      void consume(boost::log::record_view const& rec, 
        string_type const& formatted_message) 
      { 
       std::cerr<<formatted_message<<std::endl; 
       return; 
      } 

      void flush() 
      { 
       return; 
      } 
    }; 

    public: 
    typedef boost::log::sinks::synchronous_sink<custom_backend> sink_t; 
    void initialize(std::string tag) 
    { 
     auto logFmt = (
       boost::log::expressions::stream 
       <<boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d:%H:%M:%S") 
       <<"|"<< boost::log::expressions::attr<boost::log::trivial::severity_level>("Severity") 
       <<"|pid:"<<boost::log::expressions::attr<boost::log::process_id>("ProcessID") 
       <<"|tid:"<<boost::log::expressions::attr<boost::log::thread_id>("ThreadID") 
       <<"| "<<boost::log::expressions::smessage); 

     cbackend.reset(new custom_backend()); 
     custom_sink.reset(new sink_t(cbackend)); 
     custom_sink->set_formatter(logFmt); 
     boost::log::core::get()->add_sink(custom_sink); 
     return; 
    } 

    static Logger& getInstance() 
    { 
     static Logger logger; 
     return logger; 
    } 

    void finalize() 
    { 
     return; 
    } 

    static boost::log::sources::logger_mt & getLogger() 
    { 
     return _lg; 
    } 

    private: 
    static boost::log::sources::logger_mt _lg; 
    boost::shared_ptr<custom_backend> cbackend; 
    boost::shared_ptr<sink_t> custom_sink; 
}; 

boost::log::sources::logger_mt Logger::_lg; 

int main(int ac, char **av) 
{ 
    auto lg = Logger::getInstance(); 
    lg.initialize("hello"); 
    _info<<"hello world."<<std::endl; 
    _error<<"hello world."<<std::endl; 
    return 0; 
} 
+0

このような問題は、通常、フォーマッタとログレコードの不一致によって発生します。属性名またはタイプが一致しません。最初に確認してください。それ以外の場合は、完全なコードを投稿して、ライブラリの初期化と使用方法を示してください。 –

+0

こんにちはアンドレイ、応答のおかげで、私はまだ問題があるコードスニペットの作業スタンドアロンの例を貼り付けました。この例では、行boost :: log :: add_common_attributes()を追加すると、スレッドIDとプロセスIDが表示されません。 initialize()ルーチンに渡すと、threadidとprocessidが出力されますが、重大度は表示されません。お知らせ下さい。 –

答えて

1

問題は、重大度の属性を追加しなかったことです。この属性は通常ロガーによって提供されますが、logger_mtロガーを使用しています。これは属性を追加せず、BOOST_LOG_SEVマクロに指定した引数を無視します。 severity_logger_mtまたは重大度レベルをサポートするその他のロガーを使用する必要があります。このロガーは、それを介して作成されたすべてのログレコードに重大度属性を追加し、レベルをBOOST_LOG_SEVマクロ呼び出しで指定した値に設定します。

+0

ブーガー::ログ:: add_common_attributes()と一緒にseverity_logger_mtでロガーを置き換えると、ログレコードのすべての属性が出力されるようになりました。ありがとう –

関連する問題