Можно ли настроить форсировку журнала? - PullRequest
0 голосов
/ 23 октября 2018

Я использую журнал буста, и в целом все выглядит так, как я ожидал, за исключением того, как он мигает.Я ценю потенциальную ценность для производительности от буферизации и записи реже, но кажется, что из коробки он только сбрасывает:

  1. С ротацией журнала.
  2. Программа завершается.
  3. Каждые 8 ​​К или около того байтов.

Есть ли способ настроить это поведение?В частности, было бы неплохо, если бы он сбрасывался после определенного тайм-аута, а не ждал вечно этой границы 8K.

Хотя есть довольно популярный ответ на отключение буферизации через auto_flush = true (см. https://stackoverflow.com/a/18036016/629530), Я бы предпочел не отключать буферизацию, поскольку это кажется возможным препятствием для производительности. Журналы, которые мы пишем, могут быть частыми.

Вот моя текущая реализация (обратите внимание, что я использовал следующее для получения ProcessID иThreadID зарегистрирован как целые числа: https://stackoverflow.com/a/45013899/629530)

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
     logger, 
      boost::log::sources::severity_logger_mt< >);

auto logger = logging::add_file_log
(   
    keywords::file_name = "diagnostic_%N.log",
    keywords::max_files = 10, // Only keep 10 rotated files around.
    keywords::rotation_size = 10 * 1024 * 1024, // Rotate every 10 MB.
    keywords::time_based_rotation =
            sinks::file::rotation_at_time_point(3, 37, 0), //  Rotate everyday at 3:37 AM.
    keywords::target = directory,
    keywords::format =
    (   
        expr::stream
                << expr::format_date_time< boost::posix_time::ptime >(
                        "TimeStamp", "%b %d %H:%M:%S")
                << boost::phoenix::bind(
                        &get_native_process_id, process_id.or_none()) << " " 
                << boost::phoenix::bind(
                        &get_native_thread_id, thread_id.or_none()) << " " 
                << expr::message
    )   
);  
// We don't expect boost log exceptions, but if they arise discard them.
logging::core::get()->set_exception_handler(logging::make_exception_suppressor());
logging::add_common_attributes();

Затем я регистрируюсь через BOOST_LOG_TRIVIAL(info).

1 Ответ

0 голосов
/ 29 октября 2018

Boost.Log не запускает внутренние потоки, если вы не используете асинхронное ведение журнала, и даже если вы это делаете, выделенный поток не имеет возможности отложенной очистки.Таким образом, приемник не может очистить буферизованные данные после задержки.

Что вы можете сделать, это периодически очищать все приемники, вызывая core::flush() в своем собственном потоке.

...