Qt--日志系统
原创
©著作权归作者所有:来自51CTO博客作者贝勒里恩的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、前言
程序猿在开发的过程中是避免不了调试的,在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() :此函数是为了在日志中添加分割线,因为日志文件是追加的,加入分割线可以直观的查看内容
四、效果展示