#include "XNLogger.h" XNLogger::XNLogger() : consoleOutputEnabled{true, true, true, true}, fileOutputEnabled{true, true, true, true} { // 获取当前工作目录 QString currentDir = QDir::currentPath(); QString logDirPath = currentDir + "/log"; // 创建 log 文件夹 QDir logDir; if (!logDir.exists(logDirPath)) { logDir.mkpath(logDirPath); } // 创建以当前日期和时间命名的日志文件 QString logFileName = QString("log_%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss")); logFile.setFileName(logDirPath + "/" + logFileName); logFile.open(QIODevice::Append | QIODevice::Text); } XNLogger::~XNLogger() { if (logFile.isOpen()) { logFile.close(); } } void XNLogger::log(LogLevel level, const QString &message) { QMutexLocker locker(&mutex); QString logMessage = QString("[%1] [%2] %3") .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")) .arg(logLevelToString(level)) .arg(message); QString coloredMessage; // 根据日志等级设置颜色 switch (level) { case Debug: coloredMessage = COLOR_DEBUG + logMessage + COLOR_RESET; break; case Info: coloredMessage = COLOR_INFO + logMessage + COLOR_RESET; break; case Warning: coloredMessage = COLOR_WARNING + logMessage + COLOR_RESET; break; case Error: coloredMessage = COLOR_ERROR + logMessage + COLOR_RESET; break; default: coloredMessage = logMessage; // 默认无颜色 break; } // 控制台输出 if (consoleOutputEnabled[level]) { if (level == Time) { // 如果是时间日志,则不换行,回退到该行开始 QTextStream(stdout) << coloredMessage << "\r"; } else { QTextStream(stdout) << coloredMessage << "\n"; } } // 文件输出 if (fileOutputEnabled[level] && logFile.isOpen()) { QTextStream fileStream(&logFile); if (level == Time) { fileStream << logMessage << "\r"; } else { fileStream << logMessage << "\n"; } } } void XNLogger::enableConsoleOutput(LogLevel level, bool enable) { consoleOutputEnabled[level] = enable; } void XNLogger::enableFileOutput(LogLevel level, bool enable) { fileOutputEnabled[level] = enable; } QString XNLogger::logLevelToString(LogLevel level) const { switch (level) { case Debug: return "DEBUG"; case Info: return "INFO"; case Warning: return "WARNING"; case Error: return "ERROR"; case Time: return "TIME"; default: return "UNKNOWN"; } }