1.简介

在利用QT进行开发的过程中经常会用到qDebug()来输出调试信息,但当程序正式发布时,这些都会被注释或者删除,这时我们就需要通过Log日志输出来代替。

 Log日志是项目当中比用的功能,以便系统有错误是能够快速跟踪、定位,QT中提供类似的机制。在QT4中是通过Qt::qInstallMsgHandler()实现,但在QT5中使用了新的Qt::qInstallMessageHandler()来代替,详情请查看QT助手。

2.QT调试级别

  • qDebug() 调试消息
  • qInfo() 信息消息
  • qWarning() 警告消息和可恢复的错误
  • qCritical() 关键错误和系统错误
  • qFatal() 致命错误

3.代码

#include <QCoreApplication>
#include <QFile>
#include <QMutex> // 互锁头文件
#include <QTextStream>
#include <QDateTime>void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex mutex;mutex.lock();QString text;switch (type){case QtDebugMsg:text = QString("Debug:");break;case QtInfoMsg:text = QString("Info:");break;case QtWarningMsg:text = QString("Warning:");break;case QtCriticalMsg:text = QString("Critical:");break;case QtFatalMsg:text = QString("Fatal:");default:break;}QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString currentDate = QString("(%1)").arg(currentTime);QString message = QString::fromLocal8Bit("【%1】%2 %3 %4").arg(currentTime).arg(text).arg(msg).arg(context_info);QString path = QCoreApplication::applicationDirPath();QFile file(path + "/log.txt");file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream textStream(&file);textStream << message << "\r\n";file.flush();file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qInstallMessageHandler(MessageHandler);//打印日志到文件中qDebug("This is a debug message");          //  qDebug:调试信息qInfo("This is a information message");     //  Info:   信息消息qWarning("This is a warning message");      //  qWarning:警告信息qCritical("This is a critical message");    //  qCritical:严重错误qFatal("This is a fatal message");          //  qFatal:致命错误(会报错,然后准备退出)return a.exec();}

 在这使用QMutex进行加锁、解锁操作,便于我们可以安全的在多线程操作中使用。QFile打开模式为QIODevice::ReadWrite | QIODevice::Append(读写、追加模式),保证了输出信息可以以追加的形式写入文件。

4.结果:


5.注意

 以上调试结果信息在Debug模式下输出是没问题的,但是在Release模式下是默认不输出文件名、行号等信息,

 这时只需要在.pro文件中加入以下宏定义:

DEFINES += QT_MESSAGELOGCONTEXT

之后,重新qmake编译既可以。

6.参考

  • https://blog.csdn.net/CLinuxF/article/details/78948983
  • https://www.jianshu.com/p/d4671a5e1d8a

【Y忍冬草】QT:Log日志功能实现相关推荐

  1. 【Y忍冬草】QT显示软件运行时间

    [Y忍冬草]QT:显示软件运行时间 一个简单的实现检测软件运行时间的小软件: 1.代码 #include "mainwindow.h" #include "ui_main ...

  2. 【Y忍冬草】Qt消息和按钮链接网址

    对于Qt实现标准消息框和按钮实现链接网址网上有很多教程,在此记录只为自己更好的查阅. 相关代码: #include "mainwindow.h" #include "ui ...

  3. 【Y忍冬草】获取路径、打开文件图像等

    QT:获取路径.打开文件/图像等 1. 获取路径 #include <QFileDialog> #include <QMessageBox>//---------------- ...

  4. python log函数怎么打_Python的log日志功能及设置方法

    python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客

  5. python log日志_Python的log日志功能及设置方法

    引入:Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 一.日志级别(从低到高): DEBUG :详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期 ...

  6. 华为C8812E打开log日志功能

    最近做安卓android的开发测试,使用了华为的C8812E手机,结果LogCat却是空的,什么日志都没有. 原来是手机关闭了log的功能,可以采用下面的方法,进行配置: 1. 拨打:*#*#2846 ...

  7. 【Y忍冬草】Qt之客户端实现数据的接收和发送

    在使用通信功能时,需要在.pro工程中添加QT += network 相关代码: tcpClient.h文件: #ifndef TCPCLIENT_H #define TCPCLIENT_H#incl ...

  8. 【Y忍冬草】Qt之定时器

    首先,Qt对象的基类QObject为我们提供了一个基本的定时器,它是通过定时器事件来触发的.其步骤如下: step1:通过函数int QObject::startTimer(int interval) ...

  9. 【Y忍冬草】QT更改构建目录

    "你说什么样的话,你就是什么样的人" --蔡康永  真是好记性不如烂笔头. 这个小知识点在刚接触Qt的时候就知道的,结果重装了下Qt,想要去更改下构建目录,就在浆糊脑子里找啊找,最 ...

最新文章

  1. 通过几个Hello World感受.NET Core全新的开发体验
  2. 坑!只要年轻博士,薪资按考核结果发放, 高校的博后制度,究竟有多少门道?...
  3. Visual C++ 对话框增加菜单栏
  4. mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据
  5. rabbitmq3.5.1 原理和集群安装
  6. oracle集群图例
  7. Gartner 企业级网络设备市场份额报告:阿里云负载均衡增速全球第一
  8. row_number() over()排序功能说明
  9. BigBrother服务器端管理脚本_Bash
  10. 「Mac新手必备」自定义 Mac 上的控制中心和菜单栏
  11. ios开发之Info.plist文件相关配置
  12. html添加省市县联动下拉框,JSON+JS实现省市县三级联动下拉框
  13. Python中出现问题:ValueError: not enough values to unpack (expected x, got x)的可能汇总及解决办法
  14. “已取消到该网页的导航” chm文件无法显示错误 解决方法
  15. 如何伪装成一个服务端开发(五)
  16. java 泛型中的上界(extend)和下界(super)
  17. 0003 渗透测试标准
  18. 【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码
  19. “沙箱机制”是什么?
  20. 【毕业设计系列】035:基于matlab的线性调频信号的仿真

热门文章

  1. 基蛋生物PLM项目正式进入实施阶段
  2. k8s的nodeport端口范围provided port is not in the valid range. The range of valid ports is 30000-32767 解决
  3. 免费PPT模板,进来自取
  4. Lotus产品组合-单页
  5. 中关村-DIY浏览器之Chrome基础
  6. 求出50-150之间的质数
  7. Java、JSP基于SSH网上体育用品销售系统开发与设计
  8. X射线电子能谱原理及软件图谱处理
  9. 40、基于51单片机收音机 LCD1602显示系统设计
  10. altium 去掉部分铺铜_【干货】一文读懂铜再生分类与工艺