gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:52:30 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com