Files
eUi/src/launcher/logger/logService.cpp
T
RCiRoot ee97a4ab2c V20260507-2.5.3
丰富了实时翻译词库,在更多的界面提供了翻译支持。
增加了在后端可以使用临时账户登录的功能。
增加了自动删除超期的日志文件以及自动删除超期的存图路径数据库。
2026-06-03 08:54:01 +08:00

133 lines
3.8 KiB
C++

#include "logService.h"
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QFile>
#include <QDateTime>
#include <filesystem>
#include <global.h>
logService* logService::_instance = nullptr;
std::mutex logService::_instanceMutex;
logService* logService::getInstance(){
std::lock_guard<std::mutex> lock(_instanceMutex);
if (_instance == nullptr) {
_instance = new logService();
}
return _instance;
}
logService::logService(){
try {
// 确保日志目录存在
std::filesystem::create_directories(logBasePath);
// 初始化日志组件
qtLogger = std::make_unique<SpdLogger>(const_cast<std::string&>(logBasePath), "Log");
_logToQtWidget = std::make_unique<logToQtWidget>();
// STD日志重定向器
_stdConsoleRedirector = std::make_unique<stdConsoleRedirector>(std::cout);
// QT日志重定向器
_qtRediretor = std::make_unique<qtRediretor>();
// 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();
}
}