Fixed issue #726 and changed default filename calculator to dateonly
This commit is contained in:
		
							parent
							
								
									08ef5a2a66
								
							
						
					
					
						commit
						7d40244a89
					
				| @ -19,37 +19,19 @@ | |||||||
| namespace spdlog { | namespace spdlog { | ||||||
| namespace sinks { | namespace sinks { | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * Default generator of daily log file names. |  | ||||||
|  */ |  | ||||||
| struct default_daily_file_name_calculator |  | ||||||
| { |  | ||||||
|     // Create filename for the form filename.YYYY-MM-DD_hh-mm.ext
 |  | ||||||
|     static filename_t calc_filename(const filename_t &filename) |  | ||||||
|     { |  | ||||||
|         std::tm tm = spdlog::details::os::localtime(); |  | ||||||
|         filename_t basename, ext; |  | ||||||
|         std::tie(basename, ext) = details::file_helper::split_by_extenstion(filename); |  | ||||||
|         std::conditional<std::is_same<filename_t::value_type, char>::value, fmt::memory_buffer, fmt::wmemory_buffer>::type w; |  | ||||||
|         fmt::format_to(w, 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, ext); |  | ||||||
|         return fmt::to_string(w); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Generator of daily log file names in format basename.YYYY-MM-DD.ext |  * Generator of daily log file names in format basename.YYYY-MM-DD.ext | ||||||
|  */ |  */ | ||||||
| struct dateonly_daily_file_name_calculator | 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) |     static filename_t calc_filename(const filename_t &filename, const tm &now_tm) | ||||||
|     { |     { | ||||||
|         std::tm tm = spdlog::details::os::localtime(); |  | ||||||
|         filename_t basename, ext; |         filename_t basename, ext; | ||||||
|         std::tie(basename, ext) = details::file_helper::split_by_extenstion(filename); |         std::tie(basename, ext) = details::file_helper::split_by_extenstion(filename); | ||||||
|         std::conditional<std::is_same<filename_t::value_type, char>::value, fmt::memory_buffer, fmt::wmemory_buffer>::type w; |         std::conditional<std::is_same<filename_t::value_type, char>::value, fmt::memory_buffer, fmt::wmemory_buffer>::type w; | ||||||
|         fmt::format_to(w, SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}{}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, ext); |         fmt::format_to( | ||||||
|  |             w, SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}{}"), basename, now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday, ext); | ||||||
|         return fmt::to_string(w); |         return fmt::to_string(w); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| @ -57,7 +39,7 @@ struct dateonly_daily_file_name_calculator | |||||||
| /*
 | /*
 | ||||||
|  * Rotating file sink based on date. rotates at midnight |  * Rotating file sink based on date. rotates at midnight | ||||||
|  */ |  */ | ||||||
| template<class Mutex, class FileNameCalc = default_daily_file_name_calculator> | template<class Mutex, class FileNameCalc = daily_filename_calculator> | ||||||
| class daily_file_sink SPDLOG_FINAL : public base_sink<Mutex> | class daily_file_sink SPDLOG_FINAL : public base_sink<Mutex> | ||||||
| { | { | ||||||
| public: | public: | ||||||
| @ -71,16 +53,17 @@ public: | |||||||
|         { |         { | ||||||
|             throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); |             throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); | ||||||
|         } |         } | ||||||
|  |         auto now = log_clock::now(); | ||||||
|  |         file_helper_.open(FileNameCalc::calc_filename(base_filename_, now_tm(now))); | ||||||
|         rotation_tp_ = next_rotation_tp_(); |         rotation_tp_ = next_rotation_tp_(); | ||||||
|         file_helper_.open(FileNameCalc::calc_filename(base_filename_)); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     void sink_it_(const details::log_msg &, const fmt::memory_buffer &formatted) override |     void sink_it_(const details::log_msg &msg, const fmt::memory_buffer &formatted) override | ||||||
|     { |     { | ||||||
|         if (std::chrono::system_clock::now() >= rotation_tp_) |         if (msg.time >= rotation_tp_) | ||||||
|         { |         { | ||||||
|             file_helper_.open(FileNameCalc::calc_filename(base_filename_)); |             file_helper_.open(FileNameCalc::calc_filename(base_filename_, now_tm(msg.time))); | ||||||
|             rotation_tp_ = next_rotation_tp_(); |             rotation_tp_ = next_rotation_tp_(); | ||||||
|         } |         } | ||||||
|         file_helper_.write(formatted); |         file_helper_.write(formatted); | ||||||
| @ -92,15 +75,20 @@ protected: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     std::chrono::system_clock::time_point next_rotation_tp_() |     tm now_tm(log_clock::time_point tp) | ||||||
|     { |     { | ||||||
|         auto now = std::chrono::system_clock::now(); |         time_t tnow = log_clock::to_time_t(tp); | ||||||
|         time_t tnow = std::chrono::system_clock::to_time_t(now); |         return spdlog::details::os::localtime(tnow); | ||||||
|         tm date = spdlog::details::os::localtime(tnow); |     } | ||||||
|  | 
 | ||||||
|  |     log_clock ::time_point next_rotation_tp_() | ||||||
|  |     { | ||||||
|  |         auto now = log_clock::now(); | ||||||
|  |         tm date = now_tm(now); | ||||||
|         date.tm_hour = rotation_h_; |         date.tm_hour = rotation_h_; | ||||||
|         date.tm_min = rotation_m_; |         date.tm_min = rotation_m_; | ||||||
|         date.tm_sec = 0; |         date.tm_sec = 0; | ||||||
|         auto rotation_time = std::chrono::system_clock::from_time_t(std::mktime(&date)); |         auto rotation_time = log_clock::from_time_t(std::mktime(&date)); | ||||||
|         if (rotation_time > now) |         if (rotation_time > now) | ||||||
|         { |         { | ||||||
|             return rotation_time; |             return rotation_time; | ||||||
| @ -111,7 +99,7 @@ private: | |||||||
|     filename_t base_filename_; |     filename_t base_filename_; | ||||||
|     int rotation_h_; |     int rotation_h_; | ||||||
|     int rotation_m_; |     int rotation_m_; | ||||||
|     std::chrono::system_clock::time_point rotation_tp_; |     log_clock::time_point rotation_tp_; | ||||||
|     details::file_helper file_helper_; |     details::file_helper file_helper_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -79,30 +79,9 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]") | |||||||
|     REQUIRE(get_filesize(filename1) <= max_size); |     REQUIRE(get_filesize(filename1) <= max_size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST_CASE("daily_logger", "[daily_logger]]") |  | ||||||
| { |  | ||||||
|     prepare_logdir(); |  | ||||||
|     // calculate filename (time based)
 |  | ||||||
|     std::string basename = "logs/daily_log"; |  | ||||||
|     std::tm tm = spdlog::details::os::localtime(); |  | ||||||
|     fmt::memory_buffer w; |  | ||||||
|     fmt::format_to( |  | ||||||
|         w, "{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min); |  | ||||||
| 
 |  | ||||||
|     auto logger = spdlog::daily_logger_mt("logger", basename, 0, 0); |  | ||||||
|     logger->flush_on(spdlog::level::info); |  | ||||||
|     for (int i = 0; i < 10; ++i) |  | ||||||
|     { |  | ||||||
|         logger->info("Test message {}", i); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     auto filename = fmt::to_string(w); |  | ||||||
|     REQUIRE(count_lines(filename) == 10); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]") | 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>; |     using sink_type = spdlog::sinks::daily_file_sink<std::mutex, spdlog::sinks::daily_filename_calculator>; | ||||||
| 
 | 
 | ||||||
|     prepare_logdir(); |     prepare_logdir(); | ||||||
|     // calculate filename (time based)
 |     // calculate filename (time based)
 | ||||||
| @ -124,11 +103,10 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]") | |||||||
| 
 | 
 | ||||||
| struct custom_daily_file_name_calculator | struct custom_daily_file_name_calculator | ||||||
| { | { | ||||||
|     static spdlog::filename_t calc_filename(const spdlog::filename_t &basename) |     static spdlog::filename_t calc_filename(const spdlog::filename_t &basename, const tm &now_tm) | ||||||
|     { |     { | ||||||
|         std::tm tm = spdlog::details::os::localtime(); |  | ||||||
|         fmt::memory_buffer w; |         fmt::memory_buffer w; | ||||||
|         fmt::format_to(w, "{}{:04d}{:02d}{:02d}", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); |         fmt::format_to(w, "{}{:04d}{:02d}{:02d}", basename, now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday); | ||||||
|         return fmt::to_string(w); |         return fmt::to_string(w); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| @ -180,28 +158,11 @@ TEST_CASE("rotating_file_sink::calc_filename3", "[rotating_file_sink]]") | |||||||
| // regex supported only from gcc 4.9 and above
 | // regex supported only from gcc 4.9 and above
 | ||||||
| #if defined(_MSC_VER) || !(__GNUC__ <= 4 && __GNUC_MINOR__ < 9) | #if defined(_MSC_VER) || !(__GNUC__ <= 4 && __GNUC_MINOR__ < 9) | ||||||
| #include <regex> | #include <regex> | ||||||
| TEST_CASE("daily_file_sink::default_daily_file_name_calculator1", "[daily_file_sink]]") |  | ||||||
| { |  | ||||||
|     // daily_YYYY-MM-DD_hh-mm.txt
 |  | ||||||
|     auto filename = spdlog::sinks::default_daily_file_name_calculator::calc_filename("daily.txt"); |  | ||||||
|     std::regex re(R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])_\d\d-[0-5][0-9].txt$)"); |  | ||||||
|     std::smatch match; |  | ||||||
|     REQUIRE(std::regex_match(filename, match, re)); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| TEST_CASE("daily_file_sink::default_daily_file_name_calculator2", "[daily_file_sink]]") | TEST_CASE("daily_file_sink::daily_filename_calculator", "[daily_file_sink]]") | ||||||
| { | { | ||||||
|     // daily_YYYY-MM-DD_hh-mm.txt
 |     // daily_YYYY-MM-DD_hh-mm.txt
 | ||||||
|     auto filename = spdlog::sinks::default_daily_file_name_calculator::calc_filename("daily"); |     auto filename = spdlog::sinks::daily_filename_calculator::calc_filename("daily.txt", spdlog::details::os::localtime()); | ||||||
|     std::regex re(R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])_\d\d-[0-5][0-9]$)"); |  | ||||||
|     std::smatch match; |  | ||||||
|     REQUIRE(std::regex_match(filename, match, re)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| TEST_CASE("daily_file_sink::dateonly_daily_file_name_calculator", "[daily_file_sink]]") |  | ||||||
| { |  | ||||||
|     // daily_YYYY-MM-DD_hh-mm.txt
 |  | ||||||
|     auto filename = spdlog::sinks::dateonly_daily_file_name_calculator::calc_filename("daily.txt"); |  | ||||||
|     // date regex based on https://www.regular-expressions.info/dates.html
 |     // date regex based on https://www.regular-expressions.info/dates.html
 | ||||||
|     std::regex re(R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\.txt$)"); |     std::regex re(R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\.txt$)"); | ||||||
|     std::smatch match; |     std::smatch match; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user