Ускорьте.Протоколирование критических ошибок приложения

#c #boost #logging

#c #повышение #ведение журнала

Вопрос:

Я использую Boost.log в своем приложении. При массовом ведении журнала несколькими потоками операция ведения журнала не должна блокироваться, поэтому я регистрируюсь с помощью этого приемника:

     boost::log::sinks::ordering_asynchronous_sink
  

в этот файл интерфейса:

     boost::log::sinks::text_file_backend
  

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

Что я могу здесь сделать? Могу ли я принудительно записать файл при ошибках фатальной серьезности? Лучший подход?

Ответ №1:

Похоже, что записи вашего журнала не сразу сбрасываются на диск. Это типичное поведение по умолчанию для повышения производительности диска (избегая слишком большого количества небольших записей), но у него есть обратная сторона, которую вы описываете здесь. Существует флаг auto_flush, который вы можете установить в своей серверной части ведения журнала, чтобы убедиться, что все записи журнала сразу записываются на диск. Смотрите документы для получения более подробной информации.

Комментарии:

1. Возможно ли контролировать, когда применяется auto_flush? Я хочу, чтобы в файл загружались только записи ошибок.

2. @Leo: Не уверен. Единственный способ, который я могу придумать, — это если вы использовали несколько серверных систем ведения журнала, по одному для каждого типа журнала.

3. @Leo. Опять же, я не уверен, так как я только немного поиграл с boost log. Лучше всего было бы попробовать опубликовать отдельный вопрос.