QT 项目日志文件生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fuzongjian/article/details/80452084

背景

  • 在release环境下,我们是不能看到日志输出,当有问题的时候,也不找不到问题的所在,给开发造成了极大的困扰。
  • 下面的方法便可以解决这样的问题。

方法定义

// 日志生成
void LogOutTxt(QtMsgType type,const QMessageLogContext &context,const QString &msg){
#ifndef _DEBUG
    // 保证debug模式正常输出
    cout << msg.toStdString() << endl;
#endif
    mutex.lock();
    QString typeTxt;
    switch (type) {
    case QtDebugMsg:
         typeTxt = QString("Debug: "); // 调试信息
         break;
     case QtInfoMsg:
         typeTxt = QString("Info: ");
         break;
     case QtWarningMsg:
         typeTxt = QString("Warning: "); // 警告
         break;
     case QtCriticalMsg:
         typeTxt = QString("Critical: "); // 严重错误
         break;
     case QtFatalMsg:
         typeTxt = QString("Fatal: ");// 致命错误
         abort();
    default:
        break;
    }
    QString context_info = QString("File: (%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString current_time = QString("(%1)").arg( QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd"));
    QString log = QString("%1 %2 %3\r\n%4").arg(typeTxt).arg(context_info).arg(current_time).arg(msg);

    QFile file;
    QString path = QString("log%1.txt").arg(timePoint);
    file.setFileName(path);
    if(!file.open(QIODevice::ReadWrite  | QIODevice::Append)){
        QString erinfo = file.errorString();
        cout << erinfo.toStdString() << endl;
        return;
    }
    QTextStream out(&file);
    out << "\r\n" << log;
    file.flush();
    file.close();
    mutex.unlock();
}

方法使用

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

#ifndef _DEBUG
    timePoint = QDateTime::currentDateTime().toString("yyyyMMddHHmmss");
    qInstallMessageHandler(LogOutTxt);
#endif
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    // 测试
    qDebug("This is a debug message");
    qWarning("This is a warning message");
    qCritical("This is a critical message");
    return a.exec();
}

遇到问题

问题

Release中输入日志的文件信息和行数为空

原因

Debug版本是可以输出日志信息的,而Release中输入日志的文件信息和行数为空。
原因是:Qt在Release版本默认舍弃了文件信息、行数等信息

解决方案:pro文件定义一个宏,然后qmake,最后编译即可

DEFINES += QT_MESSAGELOGCONTEXT

最终结果

点击获取源码

阅读更多
换一批

没有更多推荐了,返回首页