以下是我设置记录器的方法:
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但它总是最终开发出不同的东西,以获得相同的结果。我觉得这会带来潜在的错误,因为我会重复自己,因为我会在日志记录中重写我想要的格式,只是略有不同。
编辑: 更改了源代码以更好地反映问题。
答案 0 :(得分:1)
首先,您可以使用add_console_log
功能,与您在代码中使用parse_formatter
的方式类似。
其次,这两个函数都使用formatter parser(set_formatter
函数)将格式字符串转换为可以提供给<select>
<option value="A">Option A</option>
<option value="B">Option B</option>
<option value="C">Option C</option>
<option value="D">Option D</option>
</select>
的实际格式化程序。您可以直接使用此函数来避免多次解析字符串。