/*FileLog.h*/
#ifndef FILELOG_H
#define FILELOG_H
#include <QObject>
class FileLog : public QObject
{
Q_OBJECT
public:
explicit FileLog(QObject *parent = nullptr);
void installMessageHandler();
void uninstallMessageHandler();
};
#endif // FILELOG_H
/*FileLog.cpp*/
#include "fileLog.h"
#include <QMutex>
#include <QDateTime>
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QTextStream>
const QStringList LogFiles = QStringList{
"c:/log/message0",
"c:/log/message1",
"c:/log/message2",};
const int MaxSize = 1024 * 1024 * 10;
QString CurrentLogFile;
int CurrentIndex;
//接收调试信息的函数
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
QMutexLocker lock(&mutex);
QString msgType;
switch(type)
{
//如果是debug信息,那么直接打印至应用程序输出,然后退出本函数
case QtDebugMsg:
msgType = QString("Debug");
break;
case QtInfoMsg:
msgType = QString("Info");
break;
case QtWarningMsg:
msgType = QString("Warning");
break;
case QtCriticalMsg:
msgType = QString("Critical");
break;
case QtFatalMsg:
msgType = QString("Fatal");
break;
default:
msgType = QString("Default");
break;
}
QString contextInfo = QString("%1 line[%2]")
.arg(context.file)
.arg(context.line);
//消息打印时间
QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
//调试信息
QString message = QString("%1 %2 %3: %4\n")
.arg(msgType)
.arg(strTime)
.arg(contextInfo)
.arg(msg);
//将调试信息写入文件
QFile file(CurrentLogFile);
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message;
file.flush();
file.close();
//检查文件是否达到了指定大小
QFileInfo info(CurrentLogFile);
if(info.size() >= MaxSize)
{
CurrentLogFile = LogFiles.at(++CurrentIndex % LogFiles.count());
QFile file(CurrentLogFile);
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
file.close();
}
}
//安装消息器
void FileLog::installMessageHandler()
{
qInstallMessageHandler(outputMessage);
}
//卸载消息器
void FileLog::uninstallMessageHandler()
{
qInstallMessageHandler(0);
}
FileLog::FileLog(QObject *parent) : QObject(parent)
{
qint64 nMinSize = 0;
for(int i=0;i<LogFiles.count();i++)
{
QFileInfo info(LogFiles.at(i));
qint64 size = info.size();
if(size == 0)
{
CurrentIndex = i;
CurrentLogFile = LogFiles.at(i);
break;
}
if(size < MaxSize && size > nMinSize)
{
nMinSize = size;
CurrentIndex = i;
CurrentLogFile = LogFiles.at(i);
break;
}
}
if(nMinSize == 0)
{
CurrentIndex = 0;
CurrentLogFile = LogFiles.at(0);
QFile file(CurrentLogFile);
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
file.close();
}
}
调用
FileLog* log= new FileLog;
log->installMessageHandler();
还有最最最重要的一项,在.pro文件添加
DEFINES += QT_MESSAGELOGCONTEXT
项目要清除重新编译,这样在Release模式下才能输出文件名和行号,以上。