热门IT资讯网

Qt高级——Qt日志信息处理

发表于:2024-11-30 作者:热门IT资讯网编辑
编辑最后更新 2024年11月30日,Qt高级--Qt日志信息处理一、Qt日志功能简介Qt有Debug、Warning、Critical、Fatal四种级别的调试信息。qDebug:调试信息qWarning:警告信息qCritical:严

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 #include #include #include #include #include /** * @brief 日志组件 */class LogWidget : public QWidget{    Q_OBJECTpublic:    /**     * @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 #include #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();}

3、Qt日志组件示例

三、Qt日志文件输出

1、Qt日志文件输出

#include #include #include #include #include #include #include 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日志文件

0