【Y忍冬草】QT:Log日志功能实现
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日志功能实现相关推荐
- 【Y忍冬草】QT显示软件运行时间
[Y忍冬草]QT:显示软件运行时间 一个简单的实现检测软件运行时间的小软件: 1.代码 #include "mainwindow.h" #include "ui_main ...
- 【Y忍冬草】Qt消息和按钮链接网址
对于Qt实现标准消息框和按钮实现链接网址网上有很多教程,在此记录只为自己更好的查阅. 相关代码: #include "mainwindow.h" #include "ui ...
- 【Y忍冬草】获取路径、打开文件图像等
QT:获取路径.打开文件/图像等 1. 获取路径 #include <QFileDialog> #include <QMessageBox>//---------------- ...
- python log函数怎么打_Python的log日志功能及设置方法
python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客
- python log日志_Python的log日志功能及设置方法
引入:Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 一.日志级别(从低到高): DEBUG :详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期 ...
- 华为C8812E打开log日志功能
最近做安卓android的开发测试,使用了华为的C8812E手机,结果LogCat却是空的,什么日志都没有. 原来是手机关闭了log的功能,可以采用下面的方法,进行配置: 1. 拨打:*#*#2846 ...
- 【Y忍冬草】Qt之客户端实现数据的接收和发送
在使用通信功能时,需要在.pro工程中添加QT += network 相关代码: tcpClient.h文件: #ifndef TCPCLIENT_H #define TCPCLIENT_H#incl ...
- 【Y忍冬草】Qt之定时器
首先,Qt对象的基类QObject为我们提供了一个基本的定时器,它是通过定时器事件来触发的.其步骤如下: step1:通过函数int QObject::startTimer(int interval) ...
- 【Y忍冬草】QT更改构建目录
"你说什么样的话,你就是什么样的人" --蔡康永 真是好记性不如烂笔头. 这个小知识点在刚接触Qt的时候就知道的,结果重装了下Qt,想要去更改下构建目录,就在浆糊脑子里找啊找,最 ...
最新文章
- 通过几个Hello World感受.NET Core全新的开发体验
- 坑!只要年轻博士,薪资按考核结果发放, 高校的博后制度,究竟有多少门道?...
- Visual C++ 对话框增加菜单栏
- mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据
- rabbitmq3.5.1 原理和集群安装
- oracle集群图例
- Gartner 企业级网络设备市场份额报告:阿里云负载均衡增速全球第一
- row_number() over()排序功能说明
- BigBrother服务器端管理脚本_Bash
- 「Mac新手必备」自定义 Mac 上的控制中心和菜单栏
- ios开发之Info.plist文件相关配置
- html添加省市县联动下拉框,JSON+JS实现省市县三级联动下拉框
- Python中出现问题:ValueError: not enough values to unpack (expected x, got x)的可能汇总及解决办法
- “已取消到该网页的导航” chm文件无法显示错误 解决方法
- 如何伪装成一个服务端开发(五)
- java 泛型中的上界(extend)和下界(super)
- 0003 渗透测试标准
- 【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码
- “沙箱机制”是什么?
- 【毕业设计系列】035:基于matlab的线性调频信号的仿真