需求

qt 如何把 log 输出到文件

解决

log 输出功能

log_qt.h

#ifndef LOG_QT_H
#define LOG_QT_H

#include <QString>

void LogOutputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg);

#endif // LOG_QT_H

log_qt.cpp

#include "log/log_qt.h"

#include <QString>
#include <QMutex>
#include <QDateTime>
#include <QFile>

void LogOutputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 加锁
    static QMutex mutex;
    mutex.lock();
    QString tag;
    switch(type)
    {
    case QtDebugMsg:
      tag = QString("Debug:");
      break;
    case QtWarningMsg:
      tag = QString("Warning:");
      break;
    case QtCriticalMsg:
      tag = QString("Critical:");
      break;
    case QtFatalMsg:
      tag = QString("Fatal:");
      break;
    default:break;
    }

    // 设置输出信息格式
//    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 ");
//    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);
//    QString message = QString("%1 %2").arg(current_date).arg(msg);

//    QByteArray localMsg = msg.toLocal8Bit();
    QString date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
//    QString message = QString("[%1] [%2] [File: %3] [Function: %4] [Line: %5] : %6")
//                             .arg(date_time).arg(context.file).arg(context.function).arg(context.line).arg(strMsg).arg(localMsg.constData());
//    QString message = QString("[%1] [%2] [File: %3] [Function: %4] [Line: %5] : %6").arg(date_time, tag, context.file, context.function, context.line, msg);
    QString message = QString("[ %1 ] [%2] [File: %3 ] [Function: %4 ] [Line: %5 ] : %6 ").
		    arg(date_time).arg(tag).arg(context.file).arg(context.function).arg(context.line).arg(msg);



    // 输出信息至文件中(读写、追加形式)
    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();
}

调用

#include "mainwindow.h"

#include <QApplication>

#include "log/log_qt.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //注册日志函数
    qInstallMessageHandler(LogOutputMessage);
    qDebug("This is a debug message");
    MainWindow w;
    w.show();
    return a.exec();
}

参考