Увеличить BOOST_LOG_SEV с помощью пользовательских атрибутов - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужен регистратор Boost, который регистрирует в консоли (а затем в файл) со следующими параметрами: "[% TimeStamp%] [% Severity%] [% File% (% Line%)]% Message%",Я прочитал документы Boost.Log v2 и получил «вдохновение» из других мест, но не могу заставить его работать.

// cswlogger.h
#pragma once
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/attributes/mutable_constant.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/utility/manipulators/add_value.hpp>


BOOST_LOG_GLOBAL_LOGGER(sysLogger,
boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>);


class CswLogger 
{
public:
    /// Init with default info level logging
    static void init(boost::log::trivial::severity_level level = boost::log::trivial::info);

    /// Disable logging
    static void disable();
};

#define LOG_LOG_LOCATION(LOGGER, LEVEL, ARG)            \
  BOOST_LOG_SEV(LOGGER, boost::log::trivial::LEVEL)     \
    << boost::log::add_value("Line", __LINE__)          \
    << boost::log::add_value("File", __FILE__) << ARG


/// System Log macros.
/// TRACE < DEBUG < INFO < WARN < ERROR < FATAL
#define LOG_TRACE(ARG) LOG_LOG_LOCATION(sysLogger::get(), trace, ARG);
#define LOG_DEBUG(ARG) LOG_LOG_LOCATION(sysLogger::get(), debug, ARG);
#define LOG_INFO(ARG)  LOG_LOG_LOCATION(sysLogger::get(), info, ARG);
#define LOG_WARN(ARG)  LOG_LOG_LOCATION(sysLogger::get(), warning, ARG);
#define LOG_ERROR(ARG) LOG_LOG_LOCATION(sysLogger::get(), error, ARG);
#define LOG_FATAL(ARG) LOG_LOG_LOCATION(sysLogger::get(), fatal, ARG);

И исходный файл:

//  cswlogger.cpp

#include "cswlogger.h"

#include <boost/log/core.hpp>
#include <boost/log/common.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/settings.hpp>
#include <boost/log/sinks/sync_frontend.hpp>

BOOST_LOG_GLOBAL_LOGGER_DEFAULT(sysLogger,
    boost::log::sources::severity_channel_logger_mt<boost::log::trivial::severity_level>);


void CswLogger::init(boost::log::trivial::severity_level level) 
{
    boost::log::add_console_log
    (
        std::clog,
        boost::log::keywords::format = "[%TimeStamp%] [%Severity%] [%File%(%Line%)] %Message%"
    );

    boost::log::core::get()->set_filter
    (
        boost::log::trivial::severity >= level
    );

    // Indicate start of logging
    LOG_INFO("Log Start");
}

void CswLogger::disable() 
{
    boost::log::core::get()->set_logging_enabled(false);
}

main.cpp

#include "cswlogger.h"
CswLogger::init();
LOG_INFO("This is a info trace");

Вывод этого будет: "[] [] main.cpp (3) Это информационная трассировка"

Отсутствуют параметры Timestamp и Severity,Можно ли использовать макрос журнала "BOOST_LOG_SEV" и добавлять пользовательские параметры журнала или мне нужно использовать другой подход?

1 Ответ

0 голосов
/ 12 декабря 2018

Во-первых, атрибут TimeStamp отсутствует в выводе, потому что вы не добавили его в ядро ​​ведения журнала.Вы можете добавить его, как описано здесь :

boost::log::core::get()->add_global_attribute(
    "TimeStamp",
    boost::log::attributes::local_clock());

Или вы можете добавить его в качестве одного из часто используемых атрибутов, вызвав add_common_attributes.

Далее присутствует атрибут Severity, предоставленный регистратором.Однако тип значения этого атрибута (boost::log::trivial::severity_level) по умолчанию не поддерживается для фильтров и форматеров, проанализированных из строк.Это можно решить двумя способами.

Во-первых, вы можете переключиться на ручную настройку приемников журналирования, что позволит вам установить фильтр и форматер для приемника в качестве лямбда-выражения.Таким образом, вы сможете указать тип атрибута для средства форматирования.Например:

BOOST_LOG_ATTRIBUTE_KEYWORD(a_timestamp, "TimeStamp", boost::log::attributes::local_clock::value_type)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_severity, "Severity", boost::log::trivial::severity_level)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_file, "File", std::string)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_line, "Line", int)

typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_ostream_backend > sink_t;
auto sink = boost::make_shared< sink_t >();
sink->set_formatter(boost::log::expressions::ostream
    << "[" << a_timestamp << "] "
    << "[" << a_severity << "] "
    << "[" << a_file << "(" << a_line << ")] "
    << boost::log::expressions::message);

boost::log::core::get()->add_sink(sink);

Кроме того, вы можете зарегистрировать фабрики форматирования и фильтра для атрибута Severity, чтобы синтаксические анализаторы форматирования и фильтра могли связать этот атрибут с типом boost::log::trivial::severity_level.Это подробно описано здесь .В вашем случае вы можете просто добавить этот вызов до того, как будет проанализирован любой форматтер (т.е. перед вызовом add_console_log):

boost::log::register_simple_formatter_factory<
    boost::log::trivial::severity_level, char >("Severity");
...