c++ - Boost Log Formatter 使用与关键字相同的字符串

标签 c++ logging boost formatting

这是我设置记录器的方式:

namespace logger = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
using LEVEL = boost::log::trivial::severity_level;


static void log_Severity(LEVEL level, sender_t sender, std::string message);
static void throw_Severity(LEVEL level, sender_t sender, std::string message);
static std::string getUnescaped(std::string input);
static std::string format(sender_t sender, std::string message);;
static std::string HRESULTSTRING(HRESULT result);

typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;

static std::string CreateFormat()
{
    logger::add_common_attributes();
    logger::register_simple_formatter_factory< LEVEL, char >("Severity");
    return "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%";
}

static void AddTerminalLogger(std::string format)
{
    auto sink = boost::make_shared<text_sink>();
    sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter()));
    sink->locked_backend()->auto_flush(true);
    //sink->set_formatter( format );
    logger::core::get()->add_sink(sink);
}

static void AddFileLogger(std::string path, std::string format)
{
    logger::add_file_log
        (
        logger::keywords::file_name = path + "ManualTest_%Y-%m-%d_%H-%M-%S.%N.log",
        logger::keywords::rotation_size = 10 * 1024 * 1024,
        logger::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
        logger::keywords::format = format
        );
}

static void SetLogLevel(LEVEL level)
{
    logger::core::get()->set_filter(logger::trivial::severity >= level);
}

void LogHelper::SetupLoggers(std::string path)
{
    std::string format = CreateFormat();
    AddFileLogger(path, format);
    AddTerminalLogger(format);
    SetLogLevel(LEVEL::trace);
}

我也想使用我现有的格式字符串来设置我的控制台日志记录。 我如何重用 "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%" 以便在创建格式表达式时不重复自己?

编辑: 澄清一下:据我所知,这是无效的:sink->set_formatter(expr::format("[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%")); 如果我想使用 set_formatter,我将不得不编写一个与此 logger::keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity% ]: %Message%"。如果我这样做,我会为每个记录器(终端、文件)使用一种方法,希望在两者中获得相同的格式。两个记录器都是添加到核心的接收器。所以我假设方法 logger::add_file_log 在幕后使用类似 set_formatter 的东西。我想使用某处内置的功能,允许我将字符串 "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%" 应用到下沉。我找不到文档。当我查看这个主题时,我确实找到了如何使用 set_formatter 但它总是以开发不同的东西而告终,但结果相同。我觉得这会引入潜在的错误,因为我只是重复我自己的意思,我会重写我在日志中想要的格式,只是略有不同。

编辑: 更改了源代码以更好地反射(reflect)问题。

最佳答案

首先,您可以使用 add_console_log功能类似于您在代码中使用 add_file_log 的方式。

其次,这两个函数都使用 formatter parser (parse_formatter 函数)将格式字符串转换为您可以提供给 set_formatter 的实际格式化程序。可以直接使用该函数,避免多次解析字符串。

关于c++ - Boost Log Formatter 使用与关键字相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34929640/

相关文章:

java - log4j 属性 DailyRollingFileAppender 不起作用

c++ - Boost 和 xml 解析

c++ - x64 上 Boost 1.53 和 VS 2013 的链接器错误

c++ - CUDA 内核自动调用内核完成 vector 加法。为什么?

asp.net - 如何在 .NET Framework for Serilog 中设置配置

c++ - 日志记录,如何获得命令结束?

c++ - 为什么 boost ptr_container 在运行时不会发生双重释放或损坏错误?

c++ - 在 Visual Studio 2017 中禁用烦人的调试器通知

c++ - 在 C++Amp 中减少 GPU-CPU 数据传输

c++ - 使用带有 clang++ 而不是 g++ 的 std::acos 的 Constexpr 编译错误