로그 레코드의 포맷터를 설정하면 심각도 필드가 최종 로그 메시지에 비어 있습니다. 코드는 정상적으로 컴파일되지만 예상대로 작동하지 않습니다. 제발 조언. 부스트 로그에 대한 문서는 매우 이해하기 어렵고 명확하지 않습니다.로그 메시지의 부스트 로그 심각도가 비어 있음
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;
}
이런 문제는 일반적으로 포맷터와 로그 레코드가 일치하지 않아 발생합니다. 속성 이름이나 유형이 일치하지 않습니다. 먼저 확인해야합니다. 그렇지 않으면 전체 코드를 게시하여 라이브러리를 초기화하고 사용하는 방법을 보여주십시오. –
안녕하세요 Andrey, 응답 주셔서 감사합니다. 문제가있는 코드 스 니펫의 독립 실행 형 예제를 붙여 넣었습니다. 이 예제에서는 스레드 ID와 프로세스 ID를 출력하지 않습니다. boost :: log :: add_common_attributes(); initialize() 루틴에서 threadid와 processid를 인쇄하지만 여전히 심각도 레벨은 인쇄되지 않습니다. 제발 조언. –