QT运行日志保存和对日志大小进行监控

最近在做qt的时候遇到一个问题,就是将qt程序在设备上运行,时间长或者是一些操作导致qt卡死或者崩溃的时候,无法判断qt问题出在哪里,没有的UI程序的日志进行打印保存,后面定位错误的时候会比较麻烦,于是查找了一个对qt打印进行定向输出到日志文件的方法。
在QT中对日志定向输出比较好的方法是使用ofstream的方法,向流输出数据;
也会用到一个特别重要的函数:qInstallMassageHandler(), 这个函数的功能是包qDebug(), qWarning()打印重定向输出到日志文件中,具体用法看代码部分:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

std::ofstream g_OutputDebug;

void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 加锁
    static QMutex mutex;
    static int count = 0;
    QFileInfo info("qt_run.log");
    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;
    default:
        text = QString("Debug: ");
    }

    QString context_info = QString("F:(%1) L:(%2)").arg(QString(context.file)).arg(context.line); // F文件信息L行数
    QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString current_date = QString("(%1)").arg(current_date_time);
    std::string message = qPrintable(QString("%1 %2 \t%3 \t%4").arg(text).arg(context_info).arg(current_date).arg(msg));
    g_OutputDebug.flush();//无缓冲写入,日志文件实时刷新
    g_OutputDebug << message << "\r\n"; // std::ofstream
    // 解锁
    mutex.unlock();
    count ++;
    //每打印5000次判断一次文件大小,超过5M就清空重新写入
    if(count > 5000)
    {
        count = 0;
        if(info.size() > 1024*1024*5)
        {
            g_OutputDebug.close();
            g_OutputDebug.open(qPrintable("qt_run.log"), std::ios::out | std::ios::trunc);
        }
    }
}


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

    //注册MessageHandler
    qInstallMessageHandler(outputMessage); 
	//打开日志文件,文件不存在就建立文件
	//ios::out:   文件以输出方式打开(内存数据输出到文件
	//ios::trunc:  如果文件存在,把文件长度设为0
    g_OutputDebug.open(qPrintable("qt_run.log"), std::ios::out | std::ios::trunc);

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

还有一个问题就是如果加锁和解锁的过频繁可能会带来的问题。

你可能感兴趣的:(QT,qt,ui,开发语言)