Qt将打印信息输出到文件

将打印信息(qDebug、qInfo、qWarning、qCritial等)输出到指定文件来以实现简单的日志功能。

#include "mainwindow.h"
#include <QApplication>
#include <QLoggingCategory>
#include <QMutex>
#include <QDateTime>
#include <QDir>
#include <QFileInfo>
QString logDirName = "log";
QMutex mutex;
void logInit();
void message(QtMsgType type, const QMessageLogContext &context, const QString &msg);
int main(int argc, char *argv[])
{
    logInit();
    QApplication a(argc, argv);
    qDebug()<<"aaaa";
    MainWindow w;
    w.show();
    return a.exec();
}

void logInit()
{
    QDir dir(logDirName);
    // 不存在log目录就先创建
    if (!dir.exists()) QDir().mkdir(logDirName);
    // 遍历日志目录所有日志文件,然后删除十天前的日志文件
    QFileInfoList logList = dir.entryInfoList({"*.txt"}, QDir::Files, QDir::Time);
    foreach (const QFileInfo &info, logList) {
        if (info.created().daysTo(QDateTime::currentDateTime()) > 10) dir.remove(info.fileName());
    }
    QLoggingCategory::setFilterRules("*.info=true\n");
    qInstallMessageHandler(message);
}

void message(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    mutex.lock();
    QString text = QString();
    switch (type) {
    case QtDebugMsg:
        text = "Debug";
        break;
    case QtWarningMsg:
        text = "Warning";
        break;
    case QtCriticalMsg:
        text = "Critical";
        break;
    case QtInfoMsg:
        text = "Info";
        break;
    case QtFatalMsg:
        text = "Fatal";
        break;
    default:
        break;
    }
    QString log
        = QString("[%1:%2:%3:%4]%5:%6").arg(QDateTime::currentDateTime().toString(
                                                "yyyy-MM-dd hh:mm:ss.zzz")).arg(context.file).arg(
              context.function).arg(context.line).arg(text).arg(msg);
    static QString path = QDir::cleanPath(
        logDirName+QDir::separator()+QDateTime::currentDateTime().toString(
            "yyyyMMdd-hhmmsszzz")+QString("LOG.txt"));
    QFile file(path);
    if (file.open(QIODevice::WriteOnly|QIODevice::Append)) {
        QTextStream stream(&file);
        stream<<log<<endl;
        file.flush();
        file.close();
    }
    mutex.unlock();
}

该项目内所有打印信息将会输出到指定文件,比如在主界面mainwindow中点击按钮印一句d

void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"11111";
}

程序运行后,不停点击按钮,可以看到有生成对应文件

相关推荐

  1. QT】如何printf打印输出至窗体

    2023-12-09 05:06:01       32 阅读
  2. Linux 标准输出,错误输出重定向文件

    2023-12-09 05:06:01       54 阅读
  3. python输出保存txt文档

    2023-12-09 05:06:01       41 阅读
  4. C# 打印输出以及文件输入输出

    2023-12-09 05:06:01       43 阅读
  5. spring boot 配置文件信息 赋值类注解

    2023-12-09 05:06:01       33 阅读
  6. Bash输出同时重定向标准输出stdout和文件

    2023-12-09 05:06:01       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 05:06:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 05:06:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 05:06:01       87 阅读
  4. Python语言-面向对象

    2023-12-09 05:06:01       96 阅读

热门阅读

  1. MySQL视图介绍与实验练习

    2023-12-09 05:06:01       44 阅读
  2. C++初学教程四

    2023-12-09 05:06:01       59 阅读
  3. 一键在线部署Openstack

    2023-12-09 05:06:01       55 阅读
  4. 关于webpack 的面试知识点

    2023-12-09 05:06:01       63 阅读
  5. NC 比telnet 强大网络命令

    2023-12-09 05:06:01       55 阅读
  6. Linux 基础知识整理(二)

    2023-12-09 05:06:01       60 阅读
  7. SQL怎么优化执行效率更高?

    2023-12-09 05:06:01       61 阅读
  8. 【C语言期末】题目+笔记

    2023-12-09 05:06:01       50 阅读
  9. Vue.component

    2023-12-09 05:06:01       46 阅读