From ef9842c36d275ed162a0f3511300a9fa7581de8c Mon Sep 17 00:00:00 2001 From: eao197 Date: Tue, 3 May 2016 16:20:28 +0300 Subject: [PATCH] daily_file_sink with custom file name calculator --- include/spdlog/sinks/file_sinks.h | 45 +++++++++++++++++++++-------- tests/file_log.cpp | 47 +++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/include/spdlog/sinks/file_sinks.h b/include/spdlog/sinks/file_sinks.h index e2857270..e6fe44b6 100644 --- a/include/spdlog/sinks/file_sinks.h +++ b/include/spdlog/sinks/file_sinks.h @@ -139,10 +139,40 @@ private: typedef rotating_file_sink rotating_file_sink_mt; typedef rotating_file_sinkrotating_file_sink_st; +/* +* Default generator of daily log file names. +*/ +struct default_daily_file_name_calculator +{ + //Create filename for the form basename.YYYY-MM-DD_hh-mm.extension + static filename_t calc_filename(const filename_t& basename, const filename_t& extension) + { + std::tm tm = spdlog::details::os::localtime(); + std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; + w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}.{}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, extension); + return w.str(); + } +}; + +/* +* Generator of daily log file names in format basename.YYYY-MM-DD.extension +*/ +struct dateonly_daily_file_name_calculator +{ + //Create filename for the form basename.YYYY-MM-DD.extension + static filename_t calc_filename(const filename_t& basename, const filename_t& extension) + { + std::tm tm = spdlog::details::os::localtime(); + std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; + w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}.{}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, extension); + return w.str(); + } +}; + /* * Rotating file sink based on date. rotates at midnight */ -template +template class daily_file_sink :public base_sink < Mutex > { public: @@ -161,7 +191,7 @@ public: if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59) throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); _rotation_tp = _next_rotation_tp(); - _file_helper.open(calc_filename(_base_filename, _extension)); + _file_helper.open(FileNameCalc::calc_filename(_base_filename, _extension)); } void flush() override @@ -174,7 +204,7 @@ protected: { if (std::chrono::system_clock::now() >= _rotation_tp) { - _file_helper.open(calc_filename(_base_filename, _extension)); + _file_helper.open(FileNameCalc::calc_filename(_base_filename, _extension)); _rotation_tp = _next_rotation_tp(); } _file_helper.write(msg); @@ -197,15 +227,6 @@ private: return system_clock::time_point(rotation_time + hours(24)); } - //Create filename for the form basename.YYYY-MM-DD.extension - static filename_t calc_filename(const filename_t& basename, const filename_t& extension) - { - std::tm tm = spdlog::details::os::localtime(); - std::conditional::value, fmt::MemoryWriter, fmt::WMemoryWriter>::type w; - w.write(SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}.{}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, extension); - return w.str(); - } - filename_t _base_filename; filename_t _extension; int _rotation_h; diff --git a/tests/file_log.cpp b/tests/file_log.cpp index 2abd0214..3eedbeec 100644 --- a/tests/file_log.cpp +++ b/tests/file_log.cpp @@ -77,15 +77,56 @@ TEST_CASE("daily_logger", "[daily_logger]]") } +TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]") +{ + using sink_type = spdlog::sinks::daily_file_sink< + std::mutex, + spdlog::sinks::dateonly_daily_file_name_calculator>; + prepare_logdir(); + //calculate filename (time based) + std::string basename = "logs/daily_dateonly"; + std::tm tm = spdlog::details::os::localtime(); + fmt::MemoryWriter w; + w.write("{}_{:04d}-{:02d}-{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); + auto logger = spdlog::create("logger", basename, "txt", 0, 0, true); + for (int i = 0; i < 10; ++i) + logger->info("Test message {}", i); + auto filename = w.str(); + REQUIRE(count_lines(filename) == 10); +} +struct custom_daily_file_name_calculator +{ + static spdlog::filename_t calc_filename(const spdlog::filename_t& basename, const spdlog::filename_t& extension) + { + std::tm tm = spdlog::details::os::localtime(); + fmt::MemoryWriter w; + w.write("{}{:04d}{:02d}{:02d}.{}", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, extension); + return w.str(); + } +}; +TEST_CASE("daily_logger with custom calculator", "[daily_logger_custom]]") +{ + using sink_type = spdlog::sinks::daily_file_sink< + std::mutex, + custom_daily_file_name_calculator>; + prepare_logdir(); + //calculate filename (time based) + std::string basename = "logs/daily_dateonly"; + std::tm tm = spdlog::details::os::localtime(); + fmt::MemoryWriter w; + w.write("{}{:04d}{:02d}{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); + auto logger = spdlog::create("logger", basename, "txt", 0, 0, true); + for (int i = 0; i < 10; ++i) + logger->info("Test message {}", i); - - - + auto filename = w.str(); + REQUIRE(count_lines(filename) == 10); +}