QT:Log日志功能实现

版权声明:本文为博主原创文章,转载请注明:Y忍冬草_ http://blog.csdn.net/y363703390 https://blog.csdn.net/y363703390/article/details/84934870

1.简介

在利用QT进行开发的过程中经常会用到qDebug()来输出调试信息,但当程序正式发布时,这些都会被注释或者删除,这时我们就需要通过Log日志输出来代替。

 Log日志是项目当中比用的功能,以便系统有错误是能够快速跟踪、定位,QT中提供类似的机制。在QT4中是通过Qt::qInstallMsgHandler()实现,但在QT5中使用了新的Qt::qInstallMessageHandler()来代替,详情请查看QT助手。

2.QT调试级别

  • qDebug() 调试消息
  • qInfo() 信息消息
  • qWarning() 警告消息和可恢复的错误
  • qCritical() 关键错误和系统错误
  • qFatal() 致命错误

3.代码

#include <QCoreApplication>
#include <QFile>
#include <QMutex> // 互锁头文件
#include <QTextStream>
#include <QDateTime>

void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;
    mutex.lock();

    QString text;
    switch (type)
    {
    case QtDebugMsg:
        text = QString("Debug:");
        break;
    case QtInfoMsg:
        text = QString("Info:");
        break;
    case QtWarningMsg:
        text = QString("Warning:");
        break;
    case QtCriticalMsg:
        text = QString("Critical:");
        break;
    case QtFatalMsg:
        text = QString("Fatal:");
    default:
        break;
    }

    QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
    QString currentDate = QString("(%1)").arg(currentTime);
    QString message = QString::fromLocal8Bit("【%1】%2 %3 %4").arg(currentTime).arg(text).arg(msg).arg(context_info);

    QString path = QCoreApplication::applicationDirPath();
    QFile file(path + "/log.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream textStream(&file);
    textStream << message << "\r\n";
    file.flush();
    file.close();

    mutex.unlock();
}

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

    qInstallMessageHandler(MessageHandler);

    //打印日志到文件中
    qDebug("This is a debug message");          //  qDebug:调试信息
    qInfo("This is a information message");     //  Info:   信息消息
    qWarning("This is a warning message");      //  qWarning:警告信息
    qCritical("This is a critical message");    //  qCritical:严重错误
    qFatal("This is a fatal message");          //  qFatal:致命错误(会报错,然后准备退出)

    return a.exec();

}

 在这使用QMutex进行加锁、解锁操作,便于我们可以安全的在多线程操作中使用。QFile打开模式为QIODevice::ReadWrite | QIODevice::Append(读写、追加模式),保证了输出信息可以以追加的形式写入文件。

4.结果:

在这里插入图片描述
在这里插入图片描述

5.注意

 以上调试结果信息在Debug模式下输出是没问题的,但是在Release模式下是默认不输出文件名、行号等信息,

 这时只需要在.pro文件中加入以下宏定义:

DEFINES += QT_MESSAGELOGCONTEXT

之后,重新qmake编译既可以。

6.参考

猜你喜欢

转载自blog.csdn.net/y363703390/article/details/84934870