文章目录

  • 实现Qt日志功能并输出到文件
    • 一、基本分类:
    • 二、如何截获这些信息
    • 三、将qDebug()\qWarning()\qCritical()\qFatal() 信息输出到指定文件中
    • 四、改写customMessageHandler函数

实现Qt日志功能并输出到文件

一、基本分类:

qDebug : 调试信息提示
qWarning: 一般的警告提示
qCritical: 严重错误提示

二、如何截获这些信息

Qt提供了qInstallMsgHandler 方法用来定制消息发生后如何来处理。
qInstallMsgHandler 是一个回调函数,主要是由qDebug、qWarnng、qCritical、qFatal这些函数进行触发,
也就是说,qDeubg这些函数处理的消息文本会被qInstallMsgHandler 所指向的回调函数截获,这样就允许用户自己来处理这些消息文本。
例如,你完全可以将这些消息文本输出并保存到相关的日志文件中。请看下面的示例!qFatal: 致命错误提示

三、将qDebug()\qWarning()\qCritical()\qFatal() 信息输出到指定文件中

Qt 的官方手册上提供了示例程序:

  #include  < QtDebug >#include  < QFile >#include  < QTextStream >void  customMessageHandler(QtMsgType type,  const   char   * msg){QString txt;switch  (type) {// 调试信息提示case  QtDebugMsg:txt  =  QString( ” Debug: %1 ” ).arg(msg);break ;// 一般的warning提示case  QtWarningMsg:txt  =  QString( ” Warning: %1 ” ).arg(msg);break ;// 严重错误提示case  QtCriticalMsg:txt  =  QString( ” Critical: %1 ” ).arg(msg);break ;// 致命错误提示case  QtFatalMsg:txt  =  QString( ” Fatal: %1 ” ).arg(msg);abort();}QFile outFile( ” debuglog.txt ” );outFile.open(QIODevice::WriteOnly  |  QIODevice::Append);QTextStream ts( & outFile);ts  <<  txt  <<  endl;}int  main(  int  argc,  char   *  argv[] ){QApplication app( argc, argv );// 先注册自己的MsgHandlerqInstallMsgHandler(customMessageHandler);        // 以后就可以像下面这样直接打日志到文件中,而且日志也会包含时间信息qDebug( ” This is a debug message at thisisqt.com ” );qWarning( ” This is a warning message  at thisisqt.com ” );qCritical( ” This is a critical message  at thisisqt.com ” );qFatal( ” This is a fatal message at thisisqt.com ” );return  app.exec();}

四、改写customMessageHandler函数

虽然实现了日志的输出,但是这些信息都输出到的同一个文件,对后续问题的查找不方便,可能将不同的类型的日志文件输出到不同的文件中呢?这就要改写customMessageHandler函数

#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
#include<QMutex>
#include<QDateTime>
#include<QFile>
#include<QTextStream>#include<QFile>
#include<qDebug>
#include<QMessageBox>/**
* @projectName JplocalSense
* @brief 摘要 :日志输出
*    调用格式如下:
*     qDebug("This is a debug message");
*     qWarning("This is a warning message");
*     qCritical("This is a critical message");
*     qFatal("This is a fatal message");
*
* @date 2020-10-30
*/const bool bEnableDebugLog =  1 ; //是否启用日志输出void WriteLine(QString logFileName,  QString logMessage)
{QFile file(logFileName);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << logMessage << "\r\n";file.flush();file.close();
}void Log(QString logFileName,  QString logMessage)
{static QMutex mutex;mutex.lock();if (bEnableDebugLog){WriteLine(logFileName, logMessage);}mutex.unlock();
}void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{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 ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message;QString text;QString fileName;switch(type){case QtDebugMsg:text = QString("Debug:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logDebug.txt";Log(fileName,message);break;case QtWarningMsg:text = QString("Warning:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logWarning.txt";Log(fileName,message);break;case QtCriticalMsg:text = QString("Critical:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logCritical.txt";Log(fileName,message);break;case QtFatalMsg:text = QString("Fatal:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logFatal.txt";Log(fileName,message);break;}
}

在main 函数中改写如下:

//注册MessageHandler,启用日志输出功能

  if(bEnableDebugLog){qInstallMessageHandler(outputMessage);}

调用如下:

  • qDebug("This is a debug message");
    
  • qWarning("This is a warning message");
    
  • qCritical("This is a critical message");
    
  • qFatal("This is a fatal message");
    

于是,qDebug 的日志会输出到logDebug.txt ;qWarning的日志会输出到logWarning.txt;
qCritical的日志会输出到logCritical.txt;qFatal的日志输出到logFatal.txt;

实现Qt日志功能并输出到文件相关推荐

  1. BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示

    如下功能为输出当前文件夹下的所有文件夹名并用逗号连接. 需要把 bat 文件放到指定文件夹下执行即可. @echo off for /D %%i in (*) do set /p=%%i,<nu ...

  2. springboot配置日志格式化输出到文件

    文章目录 前言 一.application.yml指定配置文件路径 二.logback-spring.xml 配置内容 前言 springboot可以配置日志输出控制台格式,输出到文件,利用logba ...

  3. 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据

    C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...

  4. linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件

    摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...

  5. linux c 日志写入文件,linux下C语言实现写日志功能

    先上程序,该程序经过测试能够很好的实现写日志要求 /************************************************************************* ...

  6. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  7. mysql dba系统学习(8)查询日志文件功能 mysql dba系统学习(9)slow query log慢查询日志功能

    查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作 Log参数将要过时,现在用general_log来代替 打开查询日志功能 mysql> showvariables l ...

  8. FFmpeg中的日志以及avio实现对文件的读写功能

    ffmpeg日志 ffmpeg日志,接口都定义在log.h,使用的库是libavutil 使用时一定要加上对头文件extern "C"外部,否则会报对应的函数没有定义 // // ...

  9. MY_Log,无缝替换原生Log,支持日志输出到文件、FirePHP

    自己扩展了一个MY_Log, 用法类似于log4j,目前支持将日志输出到文件.FirePHP. 如果你需要将日志输出到其他地方,比如邮件.数据库等,可以很方便地进行扩展. 用法很简单,大家一看就知道. ...

最新文章

  1. Py之PIL:不一样的PS之利用PIL库的img.paste方法实现合成刘若英导演电影《后来的我们》海报设计
  2. c语言用户登录成功才能,c语言用户登录.docx
  3. Android仿人人客户端(v5.7.1)——新鲜事之下拉列表(过滤项列表)
  4. html自动计算时间代码,原生JavaScript实现日期计算器功能
  5. oracle语句执行过程
  6. vs2005 应用程序正常初始化失败的解决方案
  7. 设计模式10——状态模式
  8. 【一文带你读懂机器学习】逻辑回归原理
  9. 蓝牙音频传输格式-AAC
  10. 跟葫芦兄弟学拆产品线
  11. “一站式”电子书转换工具“Calibre”
  12. ChatGPT指令大全(中文版)
  13. 王宝强代言计算机学校,《破晓屠龙》王宝强代言传奇游戏电脑手机都能玩
  14. app封装源码|­app分发源码免签H5一键封装
  15. 领导说“辛苦了”该怎么回?低情商说不辛苦,怎么回才显情商高?
  16. 邮箱每日发送有上限吗?各大邮箱每天限制发信数量多少?
  17. fastdfs安装部署整理
  18. win10如何添加或禁用开机自启动项
  19. 集成支付平台是什么?
  20. 【docker】top命令报错 “TERM environment variable not set.”

热门文章

  1. 你一定要知道的关于Linux文件目录操作的12个常用命令
  2. 深度学习入门初步——MNIST数据格式如何使用
  3. 科大星云诗社动态20210124
  4. 填表2018-11-11
  5. 安装 并且使用_安装密封圈的注意事项
  6. 有机发光二极管显示器测试方法_有机激光二极管从梦想变为现实
  7. Go进阶(1): Golang + Goland 研究Redis的基本操作与函数接口
  8. Keras + Windows +Anaconda2-4.2.0 深度学习框架快速搭建
  9. 计算机网络核心知识(下)
  10. 【CyberSecurityLearning 71】DC系列之DC-2渗透测试(WordPress)