Логи поправил

This commit is contained in:
2024-11-06 19:45:13 +05:00
parent 0688c46a7e
commit e04a48ae1d
2 changed files with 41 additions and 47 deletions

View File

@ -58,64 +58,54 @@ void Logger::processQueue() {
while (true) { while (true) {
{ {
std::unique_lock<std::mutex> lock(queueMutex); std::unique_lock<std::mutex> lock(queueMutex);
// Ждем до 1 минуты или пока условие не выполнится queueCondition.wait(lock, [this] { return !logQueue.empty() || stop; });
queueCondition.wait_for(lock, std::chrono::minutes(1), [this] { return !logQueue.empty() || stop; });
if (stop && logQueue.empty()){ if (stop && logQueue.empty()){
break; break;
} }
//Пытаемся переименовать файл если он существует
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&now_c);
// Проверяем, нужно ли переименовать файл
if (lastWriteTime != 0 && (now_c - lastWriteTime) >= 86400) {
if(std::filesystem::exists(fileName)){
if(file.is_open()) {
file.close();
}
char buffer[11]; // Длина строки "YYYY-MM-DD" + '\0'
std::memset(buffer, 0, sizeof(buffer));
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d", now_tm);
std::ostringstream newFileName;
newFileName << Utility::BeforeLast(fileName,'.') << "_" << buffer << "." << Utility::AfterLast(fileName,'.');
std::string newName = newFileName.str();
if(std::filesystem::exists(newName)){ //Не знаю по какой причине если файл существует...
std::ostringstream newFileName;
newFileName << Utility::BeforeLast(fileName,'.') << "_" << buffer << "_" << now_c << "." << Utility::AfterLast(fileName,'.');
newName = newFileName.str();
}
try {
std::filesystem::rename(fileName, newName);
} catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Error renaming file: " << e.what() << std::endl;
}
//Удаляю старые файлы
std::string folder = Utility::BeforeLast(fileName,Utility::separator());
Utility::deleteOldFiles(folder,10);
}
}
//Записываю лог в файл
if(!logQueue.empty()){ if(!logQueue.empty()){
LogRec rec = std::move(logQueue.front()); LogRec rec = std::move(logQueue.front());
logQueue.pop(); logQueue.pop();
writeLog(rec.thread,rec.level,rec.data,rec.cout); writeLog(rec.thread,rec.level,rec.data,rec.cout);
} }
//Всё что ниже для переименовывания старого файла
if(!std::filesystem::exists(fileName)){
continue;
}
// Получаем время создания файла (st_ctime)
struct stat fileInfo;
if (stat(fileName.c_str(), &fileInfo) != 0) {
std::cerr << "Error getting file info: " << fileName << std::endl;
continue;
}
std::time_t creationTime = fileInfo.st_ctime;
std::tm* creation_tm = std::localtime(&creationTime);
// Получаем текущее время
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&now_c);
//Если даты не совпадают то переименовываю файл в с датой создания и переоткрываю новый файл
if( (now_tm->tm_year != creation_tm->tm_year) ||
(now_tm->tm_mon != creation_tm->tm_mon) ||
(now_tm->tm_mday != creation_tm->tm_mday)){
if(file.is_open()) {
file.close();
}
char buffer[11]; // Длина строки "YYYY-MM-DD" + '\0'
std::memset(buffer, 0, sizeof(buffer));
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d", creation_tm);
std::ostringstream newFileName;
newFileName << Utility::BeforeLast(fileName,'.') << "_" << buffer << "." << Utility::AfterLast(fileName,'.');
std::string newName = newFileName.str();
try {
std::filesystem::rename(fileName, newName);
} catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Error renaming file: " << e.what() << std::endl;
}
//Удаляю старые файлы
std::string folder = Utility::BeforeLast(fileName,Utility::separator());
Utility::deleteOldFiles(folder,10);
}
} }
} }
} }
@ -147,6 +137,9 @@ void Logger::writeLog(std::string thread, std::string level, std::string data, b
file.write(str.str().c_str(), str.str().length()); file.write(str.str().c_str(), str.str().length());
file.flush(); file.flush();
// Обновляем время последней записи
lastWriteTime = std::time(nullptr);
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -25,6 +25,7 @@ struct LogRec{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
class Logger { class Logger {
private: private:
std::time_t lastWriteTime = 0;
std::ofstream file; std::ofstream file;
std::string fileName; std::string fileName;