#include "logService.h" #include #include #include #include #include #include #include logService* logService::_instance = nullptr; std::mutex logService::_instanceMutex; logService* logService::getInstance(){ std::lock_guard lock(_instanceMutex); if (_instance == nullptr) { _instance = new logService(); } return _instance; } logService::logService(){ try { // 确保日志目录存在 std::filesystem::create_directories(logBasePath); // 初始化日志组件 qtLogger = std::make_unique(const_cast(logBasePath), "Log"); _logToQtWidget = std::make_unique(); // STD日志重定向器 _stdConsoleRedirector = std::make_unique(std::cout); // QT日志重定向器 _qtRediretor = std::make_unique(); // STD日志到Qt日志界面、Qt主界面、spdLog _stdConsoleRedirector->registerCallback("qtLogWidget",[this](const std::string& output) { if (!output.empty() && output != "\n") { QString outPutMsg = QString::fromStdString(output); _logToQtWidget->sendStdLogSignal(outPutMsg); // Qt日志界面 _logToQtWidget->sendMainWindowStdLogSignal(outPutMsg); // Qt主界面 qtLogger->LogDebug("[STD]" + output); // spdLog } }); // STD日志到控制台 _stdConsoleRedirector->registerCallback("console",[this](const std::string& output) { if (!output.empty() && output != "\n") { _stdConsoleRedirector->writeToConsole(output); } }); // STD日志到加载界面 _stdConsoleRedirector->registerCallback("loadingWidget", [this](const std::string& output) { if (!output.empty() && output != "\n") { emit _logToQtWidget->loadingWindow_appendConsoleLog(QString::fromStdString(output)); } }); // QT日志到spdLog和Qt日志界面 _qtRediretor->registerCallback("qtLogWidget",[this](const QString& output) { if (!output.isEmpty()) { qtLogger->LogDebug("[QT]" + output.toStdString()); _logToQtWidget->sendQtLogSignal(output); // Qt日志界面 } }); // QT日志到控制台 _qtRediretor->registerCallback("console", [this](const QString& output) { if (!output.isEmpty()) { _stdConsoleRedirector->writeToConsole(output.toStdString()); } }); // 清理超出保留天数的旧日志文件 cleanupOldLogs(); } catch (const std::exception& e) { qDebug() << "Failed to initialize logService:" << e.what(); } } // 删除超出保留天数的旧日志文件 void logService::cleanupOldLogs() { try { int saveDays = logSaveDays; if (saveDays <= 0) { return; } QDir logDir(QString::fromStdString(logBasePath)); if (!logDir.exists()) { return; } QDateTime deadline = QDateTime::currentDateTime().addDays(-saveDays); const QFileInfoList fileList = logDir.entryInfoList(QStringList() << "*.log" << "*_*-*-*.log", QDir::Files, QDir::Name); int deleteCount = 0; for (const auto& fileInfo : fileList) { if (fileInfo.lastModified() < deadline) { if (QFile::remove(fileInfo.absoluteFilePath())) { deleteCount++; qDebug() << "[日志清理] 删除旧日志文件:" << fileInfo.fileName(); } else { qWarning() << "[日志清理] 删除失败:" << fileInfo.absoluteFilePath(); } } } if (deleteCount > 0) { qDebug() << "[日志清理] 完成,共删除" << deleteCount << "个旧日志文件"; } } catch (const std::exception& e) { qCritical() << "[日志清理] 异常:" << e.what(); } catch (...) { qCritical() << "[日志清理] 未知异常"; } } logService::~logService() { try { _stdConsoleRedirector.reset(); _qtRediretor.reset(); _logToQtWidget.reset(); qtLogger.reset(); } catch (const std::exception& e) { // 析构函数中不应抛出异常,只记录错误 qDebug() << "Error in logService destructor:" << e.what(); } }