文章目录
需求功能
0、记录程序关键位置运行日志;
1、按照日期单独存放;
2、将日志按照级别不同分类保存;
3、日志格式需要固定;
代码实现
使用函数QtMessageHandler qInstallMessageHandler(QtMessageHandler);来实现,是全局的;
参考说明文档首先定义并实现函数 MessWriteLog :
void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
日志等级:
- qDebug:调试信息
- qWarning:警告信息
- qCritical:错误信息
具体实现:
//写日志功能
void MessWriteLog(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
//定义日志文件存放路径
QString logDir = QApplication::applicationDirPath() + "\\RunLog\\" + QDateTime::currentDateTime().toString("yyyy_MM_dd")+"\\";
QString logFile;
QDir curDir(logDir);
if(!curDir.exists(logDir))//如果路径不存在则创建
{
curDir.mkpath(logDir);
qDebug() << logDir;
}
static QMutex mutex;//互斥量
mutex.lock();
QString contextType;//日志类型
switch(type)
{
case QtDebugMsg:
logFile=logDir+"Debug";
contextType = QString("Debug");
break;
case QtWarningMsg:
logFile=logDir+"Warning";
contextType = QString("Warning");
break;
case QtCriticalMsg:
logFile=logDir+"Critical";
contextType = QString("Critical");
break;
case QtFatalMsg:
logFile=logDir+"Fatal";
contextType = QString("Fatal");
}
QString contextInfo = QString("[%1: %2]").arg(QString(context.file)).arg(context.line);//代码所在文件及行数
QString contextTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.mmm");//当前时间
QString mess = QString("%1: [%2] %3: %4").arg(contextTime).arg(contextType).arg(contextInfo).arg(msg);//一行日志信息
QFile contextFile(logFile+".log");
contextFile.open(QIODevice::WriteOnly | QIODevice::Append);//以只写或追加方式打开文件
QTextStream contextStream(&contextFile);//定义文件流
contextStream << mess << "\r\n";//将文件流写入文件
contextFile.flush();
contextFile.close();
mutex.unlock();//释放互斥量
}
main函数中调用:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qInstallMessageHandler(MessWriteLog);//安装消息处理程序
MainWindow w;
w.show();
return a.exec();
}
程序调用
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//打印日志到文件中
qDebug("This is a debug message");
qWarning("This is a warning message");
qCritical("This is a critical message");
}
运行效果
Log文件创建
具体日志内容
注意
文件、行数等信息在Release模式下默认没有,如果需要的话需要在.pro文件种定义一个宏:
DEFINES += QT_MESSAGELOGCONTEXT
项目源码
GitHub:lizhifun / QtLogDemo
开发环境
Author:Lizhifun
OS:Windows 10 家庭中文版
Compiler:Microsoft Visual C++ Compiler 15.9.28307.1259(amd64)
Kit:Desktop Qt 5.14.2 MSVC2017 64bit
Qt Creator:4.11.1