2017-12-21 35 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

안녕하세요 Andrey, 응답 주셔서 감사합니다. 문제가있는 코드 스 니펫의 독립 실행 형 예제를 붙여 넣었습니다. 이 예제에서는 스레드 ID와 프로세스 ID를 출력하지 않습니다. boost :: log :: add_common_attributes(); initialize() 루틴에서 threadid와 processid를 인쇄하지만 여전히 심각도 레벨은 인쇄되지 않습니다. 제발 조언. –

답변

1

문제는 심각도 수준 속성을 추가하지 않은 것입니다. 이 속성은 일반적으로 로거에 의해 제공되지만 logger_mt 로거를 사용합니다.이 로거는 속성을 추가하지 않고 사용자가 BOOST_LOG_SEV 매크로에 제공하는 인수를 무시합니다. severity_logger_mt 또는 심각도 수준을 지원하는 다른 로거를 사용해야합니다. 이 로거는 심각도 레벨 속성을 통해 작성된 모든 로그 레코드에 추가하고 레벨을 BOOST_LOG_SEV 매크로 호출에서 지정한 값으로 설정합니다.

+0

감사 기록이 severity_logger_mt와 함께 boost :: log :: add_common_attributes()와 함께 바뀌었지만 이제는 로그 레코드의 모든 속성을 인쇄하고 있습니다. 감사 –