使用自定义属性增强Boost_LOG_SEV

使用自定义属性增强Boost_LOG_SEV,boost,Boost,我需要一个Boost logger,它使用以下参数记录到控制台(稍后记录到文件): “[%TimeStamp%][%Severity%][%File%(%Line%)]]%Message%”。 我已经阅读了Boost.Log v2文档,从其他地方获得了一些“灵感”,但我真的无法让它发挥作用 // cswlogger.h #pragma once #include <boost/log/sources/severity_logger.hpp> #include <boost/lo

我需要一个Boost logger,它使用以下参数记录到控制台(稍后记录到文件): “[%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);
此操作的输出将为:“[[]main.cpp(3)这是一个信息跟踪”

缺少时间戳和严重性参数。
是否可以使用“BOOST_LOG_SEV”LOG宏并添加自定义日志参数,还是需要使用其他方法

首先,输出中缺少
TimeStamp
属性,因为您尚未将其添加到日志核心。您可以按如下所述添加它:

也可以通过调用将其添加为常用属性之一

接下来,日志记录器将提供
Severity
属性。但是,默认情况下,从字符串解析的筛选器和格式化程序不支持该属性的值类型(即
boost::log::trival::severity_level
)。你可以用两种方法来解决这个问题

首先,您可以切换到日志记录接收器的手动设置,这将允许您将接收器的过滤器和格式化程序设置为lambda表达式。通过这种方式,您将能够向格式化程序提供属性类型。例如:

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);

感谢Andrey的详细解释,并感谢您使用此库所做的工作!
#include "cswlogger.h"
CswLogger::init();
LOG_INFO("This is a info trace");
boost::log::core::get()->add_global_attribute(
    "TimeStamp",
    boost::log::attributes::local_clock());
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);
boost::log::register_simple_formatter_factory<
    boost::log::trivial::severity_level, char >("Severity");