Я работаю с C ++ и использую qdebug () для печати отладчиков сообщений. Я хотел бы знать, как я могу сделать выходные сообщения QDeBug () как в консоли, так и файл одновременно. Тем не менее, я хотел бы перенаправить этот вывод в файл журнала, не теряя возможности увидеть сообщения в консоли. < /P>
Как я могу достичь этого в qt? Что мне не хватает? Как я могу сделать выход QDebug () как в консоль (или вывод визуального вывода студии), так и в файл одновременно в приложении GUI? < /P>
Вот мой код. Он успешно выводит «тест» в файл, но не вывел его в консоли < /p>
#pragma once
#include
#include
#include
#include
#include
#include
#include
static QFile debugLogFile;
static QFile warningLogFile;
static QFile criticalLogFile;
static QFile fatalLogFile;
static QMutex logMutex;
void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg) {
// 获取当前日期,用于创建日志文件夹
QString currentDate = QDateTime::currentDateTime().toString("yyyy-MM-dd");
// 构建日志文件夹路径
QString logDirPath = "../log/" + currentDate; // 存放日志的文件夹路径
QDir logDir;
// 确保文件夹存在,若不存在则创建
if (!logDir.exists(logDirPath)) {
logDir.mkpath(logDirPath); // 创建日期文件夹
}
// 根据日志类型选择文件,并确保文件只会打开一次
QFile* logFile = nullptr;
QString logFileName;
switch (type) {
case QtDebugMsg:
logFile = &debugLogFile;
logFileName = logDirPath + "/debug.log";
break;
case QtWarningMsg:
logFile = &warningLogFile;
logFileName = logDirPath + "/warning.log";
break;
case QtCriticalMsg:
logFile = &criticalLogFile;
logFileName = logDirPath + "/critical.log";
break;
case QtFatalMsg:
logFile = &fatalLogFile;
logFileName = logDirPath + "/fatal.log";
break;
}
// 确保文件按追加方式打开,且仅在第一次写入时打开文件
if (logFile && !logFile->isOpen()) {
logFile->setFileName(logFileName);
if (!logFile->open(QIODevice::WriteOnly | QIODevice::Append)) {
return;
}
}
// 锁住日志文件,确保线程安全
QMutexLocker locker(&logMutex);
QTextStream out(logFile);
// 写入时间和日志类型(单独一行)
out
Подробнее здесь: https://stackoverflow.com/questions/797 ... -file-in-c