12 #include "../details/log_msg.h" 13 #include "../details/os.h" 29 const int open_tries = 5;
30 const int open_interval = 10;
42 void open(
const filename_t &fname,
bool truncate =
false)
45 auto *mode = truncate ? SPDLOG_FILENAME_T(
"wb") : SPDLOG_FILENAME_T(
"ab");
47 for (
int tries = 0; tries < open_tries; ++tries)
49 if (!os::fopen_s(&_fd, fname, mode))
54 details::os::sleep_for_millis(open_interval);
57 throw spdlog_ex(
"Failed opening file " + os::filename_to_str(_filename) +
" for writing", errno);
60 void reopen(
bool truncate)
62 if (_filename.empty())
64 throw spdlog_ex(
"Failed re opening file - was not opened before");
66 open(_filename, truncate);
85 size_t msg_size = msg.formatted.
size();
86 auto data = msg.formatted.
data();
87 if (std::fwrite(data, 1, msg_size, _fd) != msg_size)
89 throw spdlog_ex(
"Failed writing to file " + os::filename_to_str(_filename), errno);
97 throw spdlog_ex(
"Cannot use size() on closed file " + os::filename_to_str(_filename));
99 return os::filesize(_fd);
102 const filename_t &filename()
const 107 static bool file_exists(
const filename_t &fname)
109 return os::file_exists(fname);
125 static std::tuple<filename_t, filename_t> split_by_extenstion(
const spdlog::filename_t &fname)
127 auto ext_index = fname.rfind(
'.');
130 if (ext_index == filename_t::npos || ext_index == 0 || ext_index == fname.size() - 1)
132 return std::make_tuple(fname, spdlog::filename_t());
136 auto folder_index = fname.rfind(details::os::folder_sep);
137 if (folder_index != fname.npos && folder_index >= ext_index - 1)
139 return std::make_tuple(fname, spdlog::filename_t());
143 return std::make_tuple(fname.substr(0, ext_index), fname.substr(ext_index));
148 filename_t _filename;
Definition: lib/spdlog/common.h:146
Definition: file_helper.h:25
const Char * data() const FMT_NOEXCEPT
Definition: format.h:3280
Definition: async_logger.h:26
std::size_t size() const
Definition: format.h:3271