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 append_time_string(std::back_inserter(sLogFile), QXT(
'-'), QXT(
'-'), std::chrono::system_clock::now());
47 sLogFile +=
config.svFileExtension;
51 if ((
config.eLogFilePolicy == log_file_policy::time_name
52 ||
config.eLogFilePolicy == log_file_policy::time_name_keep_current)
53 &&
config.nMaxLogFiles > 0)
55 if (
config.eLogFilePolicy == log_file_policy::time_name_keep_current
56 && std::filesystem::exists(sLogFile.
c_str()))
58 std::filesystem::file_time_type lastWriteTimeFileClock = std::filesystem::last_write_time(sLogFile.
c_str());
59 auto lastWriteTimeSystemClock = std::chrono::clock_cast<std::chrono::system_clock>(lastWriteTimeFileClock);
61 string sNewFileName = sLogFile;
63 sNewFileName += QXT(
'_');
64 append_time_string(std::back_inserter(sNewFileName), QXT(
'-'), QXT(
'-'), lastWriteTimeSystemClock);
65 sNewFileName +=
config.svFileExtension;
67 std::filesystem::rename(sLogFile.
c_str(), sNewFileName.
c_str());
70 std::vector<std::filesystem::directory_entry> logFiles;
71 for (
const std::filesystem::directory_entry& entry :
72 std::filesystem::directory_iterator(logDirPath)
74 [&
config](
const std::filesystem::directory_entry& entry)
76 return entry.path().extension() ==
config.svFileExtension;
79 const std::wstring sFilename = entry.path().filename().wstring();
80 if (sFilename.starts_with(
config.svFilePrefix))
81 logFiles.push_back(entry);
84 if (logFiles.size() >
config.nMaxLogFiles - 1)
88 [](
const std::filesystem::directory_entry& left,
const std::filesystem::directory_entry& right)
90 return std::filesystem::last_write_time(left) > std::filesystem::last_write_time(right);
93 for (
size_t i =
config.nMaxLogFiles - 1; i < logFiles.size(); ++i)
94 std::filesystem::remove(logFiles[i]);
98 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.
bool remove_suffix(value_type chSymbol) noexcept
Remove string suffix if matches.
const_pointer c_str() const noexcept
Get pointer to string zero terminated.