107 lines
2.4 KiB
C++
107 lines
2.4 KiB
C++
|
#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";
|
||
|
}
|
||
|
}
|