7 #ifndef IFM3D_COMMON_LOGGING_LOG_WRITER_FILE_H
8 #define IFM3D_COMMON_LOGGING_LOG_WRITER_FILE_H
15 #include <fmt/color.h>
17 #include <ifm3d/common/logging/log_writer.h>
21 template <
class Formatter>
28 : max_size_(max_size),
29 keep_files_(keep_files)
31 this->SetFileName(file_name);
35 SetFileName(
const std::string& file_name)
37 const std::lock_guard<std::mutex> lock(this->mutex_);
41 size_t idx_ext = file_name.find_last_of(
".");
42 if (idx_ext != std::string::npos)
44 this->file_stem_ = file_name.substr(0, idx_ext);
45 this->file_ext_ = file_name.substr(idx_ext);
49 this->file_stem_ = file_name;
55 SetKeepFiles(
int keep_files)
57 this->keep_files_ = keep_files;
61 SetMaxSize(
size_t max_size)
63 this->max_size_ = max_size;
67 Write(
const LogEntry& entry)
override
69 const auto str = Formatter::format(entry);
71 const std::lock_guard<std::mutex> lock(this->mutex_);
73 if (!this->file_.is_open())
78 if (this->keep_files_ > 0 && this->max_size_ > 0 &&
79 this->file_size_ > this->max_size_)
84 this->file_.write(str.c_str(), str.size());
85 this->file_size_ += str.size();
88 this->file_.write(
"\r\n", 2);
89 this->file_size_ += 2;
91 this->file_.write(
"\n", 1);
92 this->file_size_ += 1;
100 if (!file_.is_open())
102 auto file_name = this->GenerateFileName(0);
103 this->file_.open(file_name, std::ios::binary | std::ios::app);
106 this->file_.seekp(0, std::ios::beg);
107 auto start = this->file_.tellp();
108 this->file_.seekp(0, std::ios::end);
109 this->file_size_ = this->file_.tellp() - start;
113 this->file_size_ = 0;
121 if (
this - file_.is_open())
132 std::remove(this->GenerateFileName(this->keep_files_ - 1).c_str());
134 for (
int i = this->keep_files_ - 2; i >= 0; --i)
136 auto cur = this->GenerateFileName(i);
137 auto next = this->GenerateFileName(i + 1);
139 std::rename(cur.c_str(), next.c_str());
146 GenerateFileName(
size_t number)
149 fmt::format(
"{}.{}{}",
153 fmt::format(
"{}{}", this->file_stem_, this->file_ext_);
158 std::string file_stem_;
159 std::string file_ext_;
167 #endif // IFM3D_COMMON_LOGGING_LOG_WRITER_FILE_H