22 std::filesystem::path logDirPath =
config.svLogsDirectory;
23 if (!std::filesystem::exists(logDirPath))
25 if (!std::filesystem::create_directory(logDirPath))
28 return std::filesystem::path();
33 string sLogFile =
config.svLogsDirectory;
34 if (!
config.svLogsDirectory.empty() && !
config.svLogsDirectory.ends_with(QXT(
'/'))
35 && !
config.svLogsDirectory.ends_with(QXT(
'\\')))
39 sLogFile +=
config.svFilePrefix;
41 if (
config.eLogFilePolicy == log_file_policy::time_name)
44 QXT(
"_{:%d-%m-%Y_%H-%M-%S}"),
45 std::chrono::floor<std::chrono::seconds>(std::chrono::system_clock::now()));
48 sLogFile +=
config.svFileExtension;
52 if ((
config.eLogFilePolicy == log_file_policy::time_name
53 ||
config.eLogFilePolicy == log_file_policy::time_name_keep_current)
54 &&
config.nMaxLogFiles > 0)
56 if (
config.eLogFilePolicy == log_file_policy::time_name_keep_current
57 && std::filesystem::exists(sLogFile.
c_str()))
59 const std::filesystem::file_time_type lastWriteTimeFileClock =
60 std::filesystem::last_write_time(sLogFile.
c_str());
61 const auto lastWriteTimeSystemClock =
62 std::chrono::clock_cast<std::chrono::system_clock>(lastWriteTimeFileClock);
63 const auto lastWriteTimeSystemClockSeconds =
64 std::chrono::floor<std::chrono::seconds>(lastWriteTimeSystemClock);
66 string sNewFileName = sLogFile;
69 QXT(
"_{:%d-%m-%Y_%H-%M-%S}{}"),
70 lastWriteTimeSystemClockSeconds,
73 std::filesystem::rename(sLogFile.
c_str(), sNewFileName.
c_str());
76 std::vector<std::filesystem::directory_entry> logFiles;
77 for (
const std::filesystem::directory_entry& entry :
78 std::filesystem::directory_iterator(logDirPath)
80 [&
config](
const std::filesystem::directory_entry& entry)
82 return entry.path().extension() ==
config.svFileExtension;
85 const std::basic_string<char_type> sFilename = entry.path().filename().generic_string<char_type>();
86 if (sFilename.starts_with(
config.svFilePrefix))
87 logFiles.push_back(entry);
90 if (logFiles.size() >
config.nMaxLogFiles - 1)
94 [](
const std::filesystem::directory_entry& left,
const std::filesystem::directory_entry& right)
96 return std::filesystem::last_write_time(left) > std::filesystem::last_write_time(right);
99 for (
size_t i =
config.nMaxLogFiles - 1; i < logFiles.size(); ++i)
100 std::filesystem::remove(logFiles[i]);
104 return sLogFile.
c_str();
base_file_logger_stream(const config &streamConfig) noexcept
file_logger_stream object constructor
std::filesystem::path prepare_folder_and_get_log_file_path(const config &config) noexcept
Create a folder (if required) and get log file path.
Base class for logger streams.
requires format_acceptable_args_c< char_t, args_t... > void append_format(const format_string_type< std::type_identity_t< args_t >... > sFormat, args_t &&... args) noexcept
Append the formatted string to the current one.
bool remove_suffix(value_type chSymbol) noexcept
Remove string suffix if matches.
const_pointer c_str() const noexcept
Get pointer to string zero terminated.