一、前言

程序猿在开发的过程中是避免不了调试的,在Qt中除了打断点调试之外,我们常常还会用到QDebug来输出信息用于定位程序的问题。但是程序一旦打包发布给用户使用,release版本是看不到打印信息的,这样在碰到一些问题时就无法快速的定位错误,用户大概率描述不清问题的现象,如果程序员还不方便去现场(路途遥远),那么查找问题就会变得非常棘手,为了便于定位错误和记录系统,在程序中引入日志系统是一个不错的选择。


二、具体操作

2.1、定义日志接口

void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch(type)
{
case QtDebugMsg:
text = QString("Debug:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
break;
case QtInfoMsg:
text = QString("Info:");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
mutex.unlock();
}

2.2、向Qt注册自己的日志接口

qInstallMessageHandler(outputMessage);

2.3、任意地方打印

qDebug("调试信息");
qWarning("警告信息");
qCritical("严重错误");
qFatal("致命错误");
qInfo("正常信息");

三、完整代码

#include "mainwindow.h"

#include <QApplication>
#include <QDateTime>
#include <QMutex>
#include <QFile>

void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch(type)
{
case QtDebugMsg:
text = QString("Debug:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
mutex.unlock();
}

void space_line()
{
qDebug()<<"=======================================================";
}

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

qInstallMessageHandler(outputMessage);
atexit(space_line);

MainWindow w;
w.show();
return a.exec();
}
  • atexit(void *()):程序在退出前调用,内部参数是函数指针
  • void space_line() :此函数是为了在日志中添加分割线,因为日志文件是追加的,加入分割线可以直观的查看内容

四、效果展示

Qt--日志系统_日志系统


Qt--日志系统_分割线_02


Qt--日志系统_日志系统_03