From e04a48ae1d6ca0dd71c072521f974f820beb59e9 Mon Sep 17 00:00:00 2001 From: igor Date: Wed, 6 Nov 2024 19:45:13 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=BE=D0=B3=D0=B8=20=D0=BF=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/logger.cpp | 87 +++++++++++++++++++++++--------------------------- lib/logger.h | 1 + 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/lib/logger.cpp b/lib/logger.cpp index ba5827f..a78e974 100644 --- a/lib/logger.cpp +++ b/lib/logger.cpp @@ -58,64 +58,54 @@ void Logger::processQueue() { while (true) { { std::unique_lock lock(queueMutex); - // Ждем до 1 минуты или пока условие не выполнится - queueCondition.wait_for(lock, std::chrono::minutes(1), [this] { return !logQueue.empty() || stop; }); + queueCondition.wait(lock, [this] { return !logQueue.empty() || stop; }); if (stop && logQueue.empty()){ 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()){ LogRec rec = std::move(logQueue.front()); logQueue.pop(); 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.flush(); + + // Обновляем время последней записи + lastWriteTime = std::time(nullptr); } } //--------------------------------------------------------------------------- diff --git a/lib/logger.h b/lib/logger.h index 658138c..c468070 100644 --- a/lib/logger.h +++ b/lib/logger.h @@ -25,6 +25,7 @@ struct LogRec{ //--------------------------------------------------------------------------- class Logger { private: + std::time_t lastWriteTime = 0; std::ofstream file; std::string fileName;