133 lines
3.8 KiB
C++
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();
|
|
}
|
|
} |