XNSim/XNCore/XNLogger.cpp
2025-04-28 12:25:20 +08:00

107 lines
2.4 KiB
C++
Executable File

#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";
}
}