实现Qt日志功能并输出到文件
文章目录
- 实现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日志功能并输出到文件相关推荐
- BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示
如下功能为输出当前文件夹下的所有文件夹名并用逗号连接. 需要把 bat 文件放到指定文件夹下执行即可. @echo off for /D %%i in (*) do set /p=%%i,<nu ...
- springboot配置日志格式化输出到文件
文章目录 前言 一.application.yml指定配置文件路径 二.logback-spring.xml 配置内容 前言 springboot可以配置日志输出控制台格式,输出到文件,利用logba ...
- 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...
- linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件
摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...
- linux c 日志写入文件,linux下C语言实现写日志功能
先上程序,该程序经过测试能够很好的实现写日志要求 /************************************************************************* ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- mysql dba系统学习(8)查询日志文件功能 mysql dba系统学习(9)slow query log慢查询日志功能
查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作 Log参数将要过时,现在用general_log来代替 打开查询日志功能 mysql> showvariables l ...
- FFmpeg中的日志以及avio实现对文件的读写功能
ffmpeg日志 ffmpeg日志,接口都定义在log.h,使用的库是libavutil 使用时一定要加上对头文件extern "C"外部,否则会报对应的函数没有定义 // // ...
- MY_Log,无缝替换原生Log,支持日志输出到文件、FirePHP
自己扩展了一个MY_Log, 用法类似于log4j,目前支持将日志输出到文件.FirePHP. 如果你需要将日志输出到其他地方,比如邮件.数据库等,可以很方便地进行扩展. 用法很简单,大家一看就知道. ...
最新文章
- Py之PIL:不一样的PS之利用PIL库的img.paste方法实现合成刘若英导演电影《后来的我们》海报设计
- c语言用户登录成功才能,c语言用户登录.docx
- Android仿人人客户端(v5.7.1)——新鲜事之下拉列表(过滤项列表)
- html自动计算时间代码,原生JavaScript实现日期计算器功能
- oracle语句执行过程
- vs2005 应用程序正常初始化失败的解决方案
- 设计模式10——状态模式
- 【一文带你读懂机器学习】逻辑回归原理
- 蓝牙音频传输格式-AAC
- 跟葫芦兄弟学拆产品线
- “一站式”电子书转换工具“Calibre”
- ChatGPT指令大全(中文版)
- 王宝强代言计算机学校,《破晓屠龙》王宝强代言传奇游戏电脑手机都能玩
- app封装源码|app分发源码免签H5一键封装
- 领导说“辛苦了”该怎么回?低情商说不辛苦,怎么回才显情商高?
- 邮箱每日发送有上限吗?各大邮箱每天限制发信数量多少?
- fastdfs安装部署整理
- win10如何添加或禁用开机自启动项
- 集成支付平台是什么?
- 【docker】top命令报错 “TERM environment variable not set.”
热门文章
- 你一定要知道的关于Linux文件目录操作的12个常用命令
- 深度学习入门初步——MNIST数据格式如何使用
- 科大星云诗社动态20210124
- 填表2018-11-11
- 安装 并且使用_安装密封圈的注意事项
- 有机发光二极管显示器测试方法_有机激光二极管从梦想变为现实
- Go进阶(1): Golang + Goland 研究Redis的基本操作与函数接口
- Keras + Windows +Anaconda2-4.2.0 深度学习框架快速搭建
- 计算机网络核心知识(下)
- 【CyberSecurityLearning 71】DC系列之DC-2渗透测试(WordPress)