From 951c5b9987e21e74ad052593e56bcba89911ef80 Mon Sep 17 00:00:00 2001 From: hjs-ast Date: Thu, 28 Nov 2024 15:37:29 +0000 Subject: [PATCH] Allow manual rotation of rotating_file_sink (#3269) * Allow manual rotation of rotating_file_sink * Rename rotation method * Attempted fix for tests on Windows * Apply review mark-ups --- include/spdlog/sinks/rotating_file_sink-inl.h | 5 +++++ include/spdlog/sinks/rotating_file_sink.h | 1 + tests/test_file_logging.cpp | 20 +++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/include/spdlog/sinks/rotating_file_sink-inl.h b/include/spdlog/sinks/rotating_file_sink-inl.h index bf9351eb..9f9aa47a 100644 --- a/include/spdlog/sinks/rotating_file_sink-inl.h +++ b/include/spdlog/sinks/rotating_file_sink-inl.h @@ -69,6 +69,11 @@ SPDLOG_INLINE filename_t rotating_file_sink::filename() { return file_helper_.filename(); } +template +SPDLOG_INLINE void rotating_file_sink::rotate_now() { + rotate_(); +} + template SPDLOG_INLINE void rotating_file_sink::sink_it_(const details::log_msg &msg) { memory_buf_t formatted; diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index cd43d349..42bd3760 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -28,6 +28,7 @@ public: const file_event_handlers &event_handlers = {}); static filename_t calc_filename(const filename_t &filename, std::size_t index); filename_t filename(); + void rotate_now(); protected: void sink_it_(const details::log_msg &msg) override; diff --git a/tests/test_file_logging.cpp b/tests/test_file_logging.cpp index ac378b5c..0e4902be 100644 --- a/tests/test_file_logging.cpp +++ b/tests/test_file_logging.cpp @@ -101,3 +101,23 @@ TEST_CASE("rotating_file_logger3", "[rotating_logger]") { REQUIRE_THROWS_AS(spdlog::rotating_logger_mt("logger", basename, max_size, 0), spdlog::spdlog_ex); } + +// test on-demand rotation of logs +TEST_CASE("rotating_file_logger4", "[rotating_logger]") { + prepare_logdir(); + size_t max_size = 1024 * 10; + spdlog::filename_t basename = SPDLOG_FILENAME_T(ROTATING_LOG); + auto sink = std::make_shared(basename, max_size, 2); + auto logger = std::make_shared("rotating_sink_logger", sink); + + logger->info("Test message - pre-rotation"); + logger->flush(); + + sink->rotate_now(); + + logger->info("Test message - post-rotation"); + logger->flush(); + + REQUIRE(get_filesize(ROTATING_LOG) > 0); + REQUIRE(get_filesize(ROTATING_LOG ".1") > 0); +}