如何防止升压记录器在每条记录后添加?

How to prevent boost logger to add after each record?

本文关键字:记录 添加 何防止 记录器      更新时间:2023-10-16

>我们重构了我们的记录器,以使用boost而不是我们的内部记录器,这不是线程安全的。问题是我们围绕项目的所有日志调用(数千行代码(都以 std::endl 结尾。现在,我们的记录器是线程安全的,但输出上的记录之间有一个额外的空行。 这就是我初始化记录器的方式:

void init()
{
    boost::log::add_console_log
    (
        std::clog,
        boost::log::keywords::format =
        (
                boost::log::expressions::stream << boost::log::expressions::format_date_time<     boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
                << " [" << boost::log::expressions::attr<     LogLevel_e >("Severity") << "]: "
                << boost::log::expressions::smessage
        )
    );
}

它是一个 severity_logger_mt(( 对象,用于记录我们的消息。 我已经在他们的文档中读到,如果我创建自己的后端和前端,我也许能够防止空行发生。创建两个模块只是为了防止代码中出现一个额外的空行似乎太麻烦了。

我错过了什么吗? 有没有更简单的方法?我应该为这个问题添加更多信息吗? 此外,我们谈论的是提升 1.69。

换行符由接收器后端自动添加。修复它的"正确"方法是更改日志记录语句,以便它们不会以换行符结束消息字符串。我认为这是正确的方式,因为尾随换行符是否有意义取决于接收器后端。同一日志记录可以由多个接收器处理,换行符可能不适用于所有接收器。

但是,作为一种更快的解决方法,您可以编写自己的格式化程序,该格式化程序将跳过格式化字符串中的尾随换行符。有许多答案显示了如何编写格式化程序(例如,此处(。这是执行此操作的一种方法:

std::string_view format_message(
    boost::log::value_ref< std::string, boost::log::expressions::tag::smessage > const& message)
{
    // Check to see if the attribute value has been found
    if (message)
    {
        std::string_view msg = message.get();
        if (!msg.empty() && msg.back() == 'n')
            msg = std::string_view(msg.data(), msg.size() - 1);
        return msg;
    }
    return std::string_view();
}
void init()
{
    boost::log::add_console_log
    (
        std::clog,
        boost::log::keywords::format =
        (
            boost::log::expressions::stream
                << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
                << " [" << boost::log::expressions::attr< LogLevel_e >("Severity") << "]: "
                << boost::phoenix::bind(&format_message, boost::log::expressions::smessage.or_none())
        )
    );
}