天天看點

Qt進階——Qt日志資訊處理

作者:清風九宸

一、Qt日志功能簡介

Qt有Debug、Warning、Critical、Fatal四種級别的調試資訊。

qDebug:調試資訊

qWarning:警告資訊

qCritical:嚴重錯誤

qFatal:緻命錯誤

Qt4提供了qInstallMsgHandler(Qt5:qInstallMessageHandler)對qDebug、qWarning、qCritical、qFatal等函數輸出資訊的重定向處理。

qInstallMsgHandler是一個回調函數,由qDebug、qWarnng、qCritical、qFatal函數進行觸發,qDebug、qWarnng、qCritical、qFatal函數處理的消息文本會被qInstallMsgHandler所指向的回調函數截獲,允許使用者自己來處理輸出的消息文本。

二、Qt日志輸出元件

1、Qt日志輸出元件定義

定制一個日志資訊輸出元件。

LogWidget.h檔案:

#ifndef LOGWIDGET_H
#define LOGWIDGET_H
#include <QWidget>
#include <QTextEdit>
#include <QHBoxLayout>
#include <QApplication>
#include <QMutex>
#include <QDateTime>
/**
* @brief 日志元件
*/
class LogWidget : public QWidget
{
Q_OBJECT
public:
/**
* @brief 擷取單例
* @return
*/
static LogWidget* getInstance();
/**
* @brief 日志資訊輸出函數
* @param type 參數,日志資訊的級别
* @param msg 參數,日志資訊的内容
*/
void outputMessage(QtMsgType type, const char *msg);
protected:
explicit LogWidget(QWidget *parent = NULL);
/**
* @brief 列印日志資訊
* @param msg 輸入參數,日志資訊
*/
void printMessage(const QString& msg);
private:
static LogWidget* m_instance;//單例
QTextEdit* m_textEdit;//日志輸出多行文本框
};
#endif // LOGWIDGET_H           

LogWidget.cpp檔案:

#include "LogWidget.h"
LogWidget* LogWidget::m_instance = NULL;
LogWidget *LogWidget::getInstance()
{
if(m_instance == NULL)
{
m_instance = new LogWidget();
}
return m_instance;
}
void LogWidget::printMessage(const QString &msg)
{
m_textEdit->append(msg);
}
LogWidget::LogWidget(QWidget *parent) : QWidget(parent)
{
m_textEdit = new QTextEdit(this);
m_textEdit->setReadOnly(true);
QHBoxLayout* layout = new QHBoxLayout;
layout->addWidget(m_textEdit);
setLayout(layout);
resize(600, 200);
}
void LogWidget::outputMessage(QtMsgType type, const char *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;
}
QString message = QString("[%1] %2 %3").arg(
QDateTime::currentDateTime().toString(
"yyyy-MM-dd hh:mm:ss ddd")).arg(text).arg(msg);
printMessage(message);
mutex.unlock();
}           

2、Qt日志輸出元件的使用

#include <QApplication>
#include <QDebug>
#include "LogWidget.h"
/**
* @brief 日志輸出回調函數
* @param type 參數,日志消息的級别
* @param msg 參數,日志消息
*/
void outputMessage(QtMsgType type, const char *msg)
{
LogWidget::getInstance()->outputMessage(type, msg);
}
int main(int argc, char *argv[])
{
//注冊日志消息回調函數
qInstallMsgHandler(outputMessage);
QApplication a(argc, argv);
LogWidget::getInstance()->show();
// 列印資訊
qDebug("This is a debug message.");
qWarning("This is a warning message.");
qCritical("This is a critical message.");
//linux調用qFatal會導緻coredump
//qFatal("This is a fatal message");
return a.exec();
}           

點選領取Qt學習資料+視訊教程~Qt開發(視訊教程+文檔+代碼+項目實戰)

3、Qt日志元件示例

三、Qt日志檔案輸出

1、Qt日志檔案輸出

#include <QApplication>
#include <QDebug>
#include <QTextStream>
#include <QDateTime>
#include <QFile>
#include <QString>
#include <QMutex>
void outputMessage(QtMsgType type, const char* 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(__FILE__).arg(__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 out(&file);
out << message << "\n";
file.flush();
file.close();
mutex.unlock();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//注冊MessageHandler
qInstallMsgHandler(outputMessage);
//列印日志到檔案中
qDebug("This is a debug message");
qWarning("This is a warning message");
qCritical("This is a critical message");
//qFatal("This is a fatal message");
return app.exec();
}           

2、Qt日志檔案

Qt進階——Qt日志資訊處理

繼續閱讀