6#ifndef SPDLOG_HEADER_ONLY
26template<
typename Mutex>
29 : base_filename_(
std::move(base_filename))
31 , max_files_(max_files)
43template<
typename Mutex>
56template<
typename Mutex>
60 return file_helper_.filename();
63template<
typename Mutex>
68 current_size_ += formatted.size();
69 if (current_size_ > max_size_)
72 current_size_ = formatted.size();
74 file_helper_.write(formatted);
77template<
typename Mutex>
88template<
typename Mutex>
94 for (
auto i = max_files_; i > 0; --i)
96 filename_t src = calc_filename(base_filename_, i - 1);
97 if (!path_exists(src))
101 filename_t target = calc_filename(base_filename_, i);
103 if (!rename_file_(src, target))
109 if (!rename_file_(src, target))
111 file_helper_.reopen(
true);
113 throw_spdlog_ex(
"rotating_file_sink: failed renaming " + filename_to_str(src) +
" to " + filename_to_str(target), errno);
117 file_helper_.reopen(
true);
122template<
typename Mutex>
static std::tuple< filename_t, filename_t > split_by_extension(const filename_t &fname)
void open(const filename_t &fname, bool truncate=false)
bool rename_file_(const filename_t &src_filename, const filename_t &target_filename)
filename_t base_filename_
rotating_file_sink(filename_t base_filename, std::size_t max_size, std::size_t max_files, bool rotate_on_open=false)
std::size_t current_size_
static filename_t calc_filename(const filename_t &filename, std::size_t index)
void sink_it_(const details::log_msg &msg) override
details::file_helper file_helper_
#define SPDLOG_FILENAME_T(s)
SPDLOG_INLINE std::string filename_to_str(const filename_t &filename)
SPDLOG_INLINE int remove(const filename_t &filename) SPDLOG_NOEXCEPT
SPDLOG_INLINE int rename(const filename_t &filename1, const filename_t &filename2) SPDLOG_NOEXCEPT
SPDLOG_INLINE bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT
SPDLOG_INLINE void sleep_for_millis(unsigned int milliseconds) SPDLOG_NOEXCEPT
SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno)
fmt::basic_memory_buffer< char, 250 > memory_buf_t