From 1a1a7e05eb75dd6fddc58b96eef8b22082a03250 Mon Sep 17 00:00:00 2001 From: Ali Alamiri Date: Sat, 23 May 2020 22:50:31 +0100 Subject: [PATCH] extract date component from daily file name --- include/spdlog/sinks/daily_file_sink.h | 32 ++++++++++++++++++++++++-- tests/test_daily_logger.cpp | 22 ++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/spdlog/sinks/daily_file_sink.h b/include/spdlog/sinks/daily_file_sink.h index a3843af7..7c025855 100644 --- a/include/spdlog/sinks/daily_file_sink.h +++ b/include/spdlog/sinks/daily_file_sink.h @@ -26,13 +26,41 @@ namespace sinks { */ struct daily_filename_calculator { - // Create filename for the form basename.YYYY-MM-DD + // Create filename for the form basename_YYYY-MM-DD static filename_t calc_filename(const filename_t &filename, const tm &now_tm) { filename_t basename, ext; std::tie(basename, ext) = details::file_helper::split_by_extension(filename); return fmt::format( - SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}{}"), basename, now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday, ext); + SPDLOG_FILENAME_T("{}{}{:04d}-{:02d}-{:02d}{}"), basename, filename_prefix_symbol(), now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday, ext); + } + + // Extract the YYYY-MM-DD suffix from the file name that was based on base_filename and calculated using calc_filename. + static filename_t extract_date_suffix(const filename_t &base_filename, const filename_t &filename) + { + const filename_t base_filename_no_ext = std::get<0>(details::file_helper::split_by_extension(base_filename)); + + const filename_t prefix = base_filename_no_ext + filename_prefix_symbol(); + + const bool starts_with_base_filename = filename.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), filename.begin()); + + if(starts_with_base_filename) + { + const filename_t filename_no_ext = std::get<0>(details::file_helper::split_by_extension(filename)); + const filename_t::size_type last_prefix_symbol = filename_no_ext.find_last_of(filename_prefix_symbol()); + + if(last_prefix_symbol < filename_no_ext.size()) + { + return filename_no_ext.substr(last_prefix_symbol + 1); + } + } + + return SPDLOG_FILENAME_T(""); + } + + static filename_t filename_prefix_symbol() + { + return SPDLOG_FILENAME_T("_"); } }; diff --git a/tests/test_daily_logger.cpp b/tests/test_daily_logger.cpp index a3e70e68..98cbfe54 100644 --- a/tests/test_daily_logger.cpp +++ b/tests/test_daily_logger.cpp @@ -99,6 +99,28 @@ TEST_CASE("daily_file_sink::daily_filename_calculator", "[daily_file_sink]]") } #endif +TEST_CASE("daily_file_sink::daily_filename_calculator::extract_date_suffix", "[daily_file_sink]]") +{ + auto now = spdlog::details::os::localtime(); + + auto basename = "daily.txt"; + + auto filename = spdlog::sinks::daily_filename_calculator::calc_filename(basename, now); + + auto date_suffix = spdlog::sinks::daily_filename_calculator::extract_date_suffix(basename, filename); + + auto expected_suffix = fmt::format(SPDLOG_FILENAME_T("{:04d}-{:02d}-{:02d}"), now.tm_year + 1900, now.tm_mon + 1, now.tm_mday); + + REQUIRE(date_suffix == expected_suffix); +} + +TEST_CASE("daily_file_sink::daily_filename_calculator::extract_date_suffix2", "[daily_file_sink]]") +{ + auto date_suffix = spdlog::sinks::daily_filename_calculator::extract_date_suffix("basename", "filename"); + + REQUIRE(date_suffix == ""); +} + /* Test removal of old files */ static spdlog::details::log_msg create_msg(std::chrono::seconds offset) {