Я использую журнал буста, и в целом все выглядит так, как я ожидал, за исключением того, как он мигает.Я ценю потенциальную ценность для производительности от буферизации и записи реже, но кажется, что из коробки он только сбрасывает:
- С ротацией журнала.
- Программа завершается.
- Каждые 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)
.