diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index ce0d7b1e..0285be36 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -22,8 +22,8 @@ template class rotating_file_sink final : public base_sink { public: - rotating_file_sink(filename_t base_filename, std::size_t max_size, std::size_t max_files, bool rotate_on_open = false, - const file_event_handlers &event_handlers = {}); + rotating_file_sink(filename_t base_filename, std::size_t max_size, std::size_t max_files, rotate_file_mode rmode = rotate_file_mode::desc, + bool rotate_on_open = false, const file_event_handlers &event_handlers = {}); static filename_t calc_filename(const filename_t &filename, std::size_t index); filename_t filename(); @@ -32,12 +32,21 @@ protected: void flush_() override; private: + void rotate_(); + + // Rotate files: + // log.1.txt -> delete + // log.2.txt -> log.1.txt + // log.3.txt -> log.2.txt + // log.txt -> log.3.txt + void rotate_asc_(); + // Rotate files: // log.txt -> log.1.txt // log.1.txt -> log.2.txt // log.2.txt -> log.3.txt // log.3.txt -> delete - void rotate_(); + void rotate_desc_(); // delete the target if exists, and rename the src file to target // return true on success, false otherwise. @@ -48,6 +57,7 @@ private: std::size_t max_files_; std::size_t current_size_; details::file_helper file_helper_; + spdlog::rotate_file_mode rotate_mode_; }; using rotating_file_sink_mt = rotating_file_sink; @@ -61,18 +71,18 @@ using rotating_file_sink_st = rotating_file_sink; template inline std::shared_ptr rotating_logger_mt(const std::string &logger_name, const filename_t &filename, size_t max_file_size, - size_t max_files, bool rotate_on_open = false, const file_event_handlers &event_handlers = {}) + size_t max_files, rotate_file_mode rmode = rotate_file_mode::desc, bool rotate_on_open = false, const file_event_handlers &event_handlers = {}) { return Factory::template create( - logger_name, filename, max_file_size, max_files, rotate_on_open, event_handlers); + logger_name, filename, max_file_size, max_files, rmode, rotate_on_open, event_handlers); } template inline std::shared_ptr rotating_logger_st(const std::string &logger_name, const filename_t &filename, size_t max_file_size, - size_t max_files, bool rotate_on_open = false, const file_event_handlers &event_handlers = {}) + size_t max_files, rotate_file_mode rmode = rotate_file_mode::desc, bool rotate_on_open = false, const file_event_handlers &event_handlers = {}) { return Factory::template create( - logger_name, filename, max_file_size, max_files, rotate_on_open, event_handlers); + logger_name, filename, max_file_size, max_files, rmode, rotate_on_open, event_handlers); } } // namespace spdlog