Как не допустить добавления логгера \ n после каждой записи? - PullRequest
1 голос
/ 05 июня 2019

Мы реорганизовали наш регистратор, чтобы использовать 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.

1 Ответ

3 голосов
/ 05 июня 2019

Новая строка автоматически добавляется бэкэндом приемника. «Правильный» способ исправить это - изменить операторы записи в журнал, чтобы они не заканчивали строку сообщения новой строкой. Я считаю, что это правильный путь, потому что, имеет ли смысл завершающий перевод новой строки, зависит от внутреннего интерфейса. Одна и та же запись журнала может обрабатываться несколькими приемниками, и новая строка может не подходить для всех из них.

Однако, в качестве более быстрого обходного пути, вы можете написать свой собственный форматер, который пропустит завершающий перевод строки из отформатированной строки. Есть несколько ответов, показывающих, как написать форматтер (например, здесь ). Вот один из способов сделать это:

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())
        )
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...