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

时间:2016-01-21 16:52:52

标签: 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但它总是最终开发出不同的东西,以获得相同的结果。我觉得这会带来潜在的错误,因为我会重复自己,因为我会在日志记录中重写我想要的格式,只是略有不同。

编辑: 更改了源代码以更好地反映问题。

1 个答案:

答案 0 :(得分:1)

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

其次,这两个函数都使用formatter parserset_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> 的实际格式化程序。您可以直接使用此函数来避免多次解析字符串。