From 5afe84303737e0e86e8d7e061f454a6497322d66 Mon Sep 17 00:00:00 2001 From: TianZD <> Date: Sun, 29 Mar 2026 18:40:26 +0800 Subject: [PATCH] =?UTF-8?q?modify:=E4=BF=AE=E6=94=B9mylog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loghandler.cpp | 65 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/loghandler.cpp b/loghandler.cpp index f879085..4e7ea80 100644 --- a/loghandler.cpp +++ b/loghandler.cpp @@ -6,63 +6,72 @@ #include #include #include -#include #include -#include -#include "Singleton.h" #include QMutex g_mutex; -//QTextStream *g_in = nullptr; QFile g_file; +QTextStream g_stream; +qint64 g_lastFlushMs = 0; +constexpr qint64 kLogFlushIntervalMs = 1000; // 消息处理函数 void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { - g_mutex.lock(); - QString level; + QMutexLocker locker(&g_mutex); + QString level, colorLevel; switch (type) { case QtDebugMsg: level = "DEBUG"; + colorLevel = "\033[36m" + level + "\033[0m"; // 青色 break; case QtInfoMsg: level = "INFO "; + colorLevel = "\033[32m" + level + "\033[0m"; // 绿色 break; case QtWarningMsg: level = "WARN "; + colorLevel = "\033[33m" + level + "\033[0m"; // 黄色 break; case QtCriticalMsg: level = "ERROR"; + colorLevel = "\033[31m" + level + "\033[0m"; // 红色 break; case QtFatalMsg: level = "FATAL"; + colorLevel = "\033[31m" + level + "\033[0m"; // 红色 break; default: break; } - // 输出到标准输出: Windows 下 std::cout 使用 GB2312,而 msg 使用 UTF-8,但是程序的 Local 也还是使用 UTF-8 -#if defined(Q_OS_WIN) - QByteArray localMsg = QTextCodec::codecForName("GB2312")->fromUnicode(msg); //msg.toLocal8Bit(); -#else - QByteArray localMsg = msg.toLocal8Bit(); -#endif - // 输出到日志文件, 格式: 时间 - [Level] (文件名:行数, 函数): 消息 - QString fileName = context.file; + QString fileName = context.file ? QString::fromUtf8(context.file) : QStringLiteral("unknown"); int index = fileName.lastIndexOf(QDir::separator()); - fileName = fileName.mid(index + 1); - QString msgOut = QString("%1 - [%2] (%3:%4, %5): %6") - .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")).arg(level) - .arg(fileName).arg(context.line).arg(context.function).arg(msg); + if (index >= 0) + { + fileName = fileName.mid(index + 1); + } + + const QString funcName = context.function ? QString::fromUtf8(context.function) : QStringLiteral("unknown"); + QString msgOut = QString("%1-[%2](%3:%4,%5): %6") + .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"),colorLevel, fileName, QString(context.line), funcName, msg); + std::cout << msgOut.toLocal8Bit().constData() << std::endl; - QTextStream in(&g_file); - in.setCodec("UTF-8"); - in << msgOut << "\n"; -// g_file.flush(); - g_mutex.unlock(); + + if (g_file.isOpen()) + { + g_stream << msgOut << "\n"; + const qint64 now = QDateTime::currentMSecsSinceEpoch(); + if (type >= QtCriticalMsg || now - g_lastFlushMs >= kLogFlushIntervalMs) + { + g_stream.flush(); + g_file.flush(); + g_lastFlushMs = now; + } + } } // 给Qt安装消息处理函数 @@ -94,19 +103,23 @@ void LogHandler::installMessageHandler() { return; } -// g_in = new QTextStream(&g_file); + + g_stream.setDevice(&g_file); + g_stream.setCodec("UTF-8"); + g_lastFlushMs = QDateTime::currentMSecsSinceEpoch(); qInstallMessageHandler(messageHandler); // 给 Qt 安装自定义消息处理函数 } // 取消安装消息处理函数并释放资源 void LogHandler::uninstallMessageHandler() { - g_mutex.lock(); + QMutexLocker locker(&g_mutex); if(g_file.isOpen()) { + g_stream.flush(); g_file.flush(); g_file.close(); } - g_mutex.unlock(); + g_stream.setDevice(nullptr); qInstallMessageHandler(nullptr); }