当前位置: 首页 > news >正文

将通过qDebug、qWarning等输出的信息保存到日志文件中

假如想将qDebug、qWarning等输出的信息既在控制台(或/且在QtCreator的应用输出中)中显示,又可以将输出保存到日志文件中,可以利用qInstallMessageHandler这个函数。
下面的代码实现了上述的功能,同时还可以让在控制台的输出带颜色。
关于颜色,可以参考这个的说明:
【使用ANSI转义序列设置终端文本颜色】
在这里插入图片描述

#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QDateTime>
#include <stdio.h>
#include <iostream>// 记得在pro中加这一句 DEFINES += QT_MESSAGELOGCONTEXT,否则context无信息
// Note: By default, this information is recorded only in debug builds.
// You can overwrite this explicitly by defining QT_MESSAGELOGCONTEXT or QT_NO_MESSAGELOGCONTEXT.
void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg) {static QMutex mutex;QMutexLocker lock(&mutex);QString colorFlag;QString level;switch (type) {case QtDebugMsg:{level = "DEBUG";colorFlag = "\033[37m%1\033[0m";}break;case QtWarningMsg:{level = "WARNING";colorFlag = "\033[33m%1\033[0m";}break;case QtCriticalMsg:{level = "CRITICAL";colorFlag = "\033[31m%1\033[0m";}break;case QtFatalMsg:{level = "FATAL";colorFlag = "\033[41m%1\033[0m";}break;case QtInfoMsg:{level = "INFO";colorFlag = "\033[32m%1\033[0m";}break;}QString fileStr = "UnknowFile";if(context.file != nullptr){fileStr = context.file;}int lineNum = context.line;QString finalMsg = QString("[%1][%2][%3][%4] %5").arg(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")).arg(level).arg(fileStr).arg(lineNum).arg(msg);// 是否保存到文件if(1){QFile file("app.log");if (!file.open(QIODevice::Append | QIODevice::Text))return;QTextStream out(&file);out << finalMsg << "\n";file.close();}std::cout<< colorFlag.arg(finalMsg).toLocal8Bit().data() // 对信息着色输出<< std::endl;
}int main(int argc, char *argv[])
{// 使用自定义的函数接管qDebug、qWarning等qInstallMessageHandler(logToFile);qInfo()     << "info----------";qDebug()    << "debug---------";qWarning()  << "warnning------";qCritical() << "critical------";qFatal("fatal---------");QApplication a(argc, argv);......return a.exec();
}

相关文章:

  • 用递归实现各种排列
  • Java 显式锁与 Condition 的使用详解
  • MySQL 数据库
  • VBA -- 学习Day2
  • STM32系统定时器以及微秒延时函数分析
  • 在openEuler系统下编译安装Redis数据库指南
  • JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)
  • 基于Partial Cross Entropy的弱监督语义分割实战指南
  • Python开发之os.path的常用操作
  • 2025年3月青少年机器人技术等级考试(二级)理论综合真题试卷
  • 【使用switch结构输出季节】2021-11-23
  • Wubuntu安装时创建分区失败解决方案
  • 贝叶斯定理
  • [python] 函数1-函数基础
  • uniapp index.html怎么改都不生效
  • Java 异常
  • 【PhysUnits】2 SI 量纲 实现解析(prefix.rs)
  • el-table合并单元
  • 数据结构(三)——栈和队列
  • uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘
  • 游客称在网红雪山勒多曼因峰需救援被开价2.8万,康定文旅:封闭整改
  • 丰田汽车:美国关税或导致4、5月损失1800亿日元,新财年净利润下滑三成
  • 公示!17个新职业、42个新工种亮相
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 美国与胡塞武装达成停火协议,美伊相向而行?
  • 8小时《大师与玛格丽特》:长度可以是特点,但不是价值标准