diff --git a/include/spdlog/sinks/rotating_file_sink-inl.h b/include/spdlog/sinks/rotating_file_sink-inl.h index 7401e4f2..9360edcd 100644 --- a/include/spdlog/sinks/rotating_file_sink-inl.h +++ b/include/spdlog/sinks/rotating_file_sink-inl.h @@ -67,13 +67,18 @@ SPDLOG_INLINE void rotating_file_sink::sink_it_(const details::log_msg &m { memory_buf_t formatted; base_sink::formatter_->format(msg, formatted); - current_size_ += formatted.size(); - if (current_size_ > max_size_) + auto new_size = current_size_ + formatted.size(); + + // rotate if the new estimated file size exceeds max size. + // check also that the real size > 0 to better deal with full disk (see issue #2261). + // we only check the real size when new_size > max_size_ because it is relatively expensive. + if (new_size > max_size_ && file_helper_.size() > 0) { rotate_(); - current_size_ = formatted.size(); + new_size = formatted.size(); } file_helper_.write(formatted); + current_size_ = new_size; } template @@ -92,6 +97,7 @@ SPDLOG_INLINE void rotating_file_sink::rotate_() { using details::os::filename_to_str; using details::os::path_exists; + file_helper_.close(); for (auto i = max_files_; i > 0; --i) {