Qt日志重定向输出类怎么使用
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容主要讲解"Qt日志重定向输出类怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt日志重定向输出类怎么使用"吧!一、前言用qt开发商业程序已
千家信息网最后更新 2025年12月03日Qt日志重定向输出类怎么使用
本篇内容主要讲解"Qt日志重定向输出类怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt日志重定向输出类怎么使用"吧!
一、前言
用qt开发商业程序已经十年了,陆陆续续开发过至少几十个程序,除了一些算不算项目的小工具外,大部分的程序都需要有个日志的输出功能,希望可以将程序的运行状态存储到文本文件或者数据库或者做其他处理等,qt对这个日志输出也做了很好的封装,在Qt4是qInstallMsgHandler,Qt5里边是qInstallMessageHandler,有了这个神器,只要在你的项目中所有qdebug qinfo等输出的日志信息,都会重定向接收到,网上大部分人写的demo都是接收到输出打印日志存储到文本文件,其实这就带给很多人误解,容易产生以为日志只能输出到文本文件,其实安装了日志钩子以后,拿到了所有调试打印信息,你完全可以用来存储到数据库+html有颜色区分格式的文件+网络转发输出(尤其适用于嵌入式linux无界面程序,现场不方便外接调试打印的设备)。 做过的这么多项目中,Qt4和Qt5的都有,我一般保留四个版本,4.8.7,为了兼容qt4, 5.7.0,最后的支持XP的版本, 最新的长期支持版本5.9.7 最高的新版本5.12。毫无疑问,我要封装的这个日志类,也要支持4+5的,而且提供友好的接口。
主要功能:
支持动态启动和停止。
支持日志存储的目录。
支持网络发出打印日志。
支持Qt4+Qt5,开箱即用。
支持多线程。
使用做到最简单,start即可。
二、代码思路
//日志重定向#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))void Log(QtMsgType type, const char *msg)#elsevoid Log(QtMsgType type, const QMessageLogContext &, const QString &msg)#endif{ //加锁,防止多线程中qdebug太频繁导致崩溃 QMutex mutex; QMutexLocker locker(&mutex); QString content; //这里可以根据不同的类型加上不同的头部用于区分 switch (type) { case QtDebugMsg: content = QString("%1").arg(msg); break; case QtWarningMsg: content = QString("%1").arg(msg); break; case QtCriticalMsg: content = QString("%1").arg(msg); break; case QtFatalMsg: content = QString("%1").arg(msg); break; } SaveLog::Instance()->save(content);}QScopedPointer SaveLog::self;SaveLog *SaveLog::Instance(){ if (self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if (self.isNull()) { self.reset(new SaveLog); } } return self.data();}SaveLog::SaveLog(QObject *parent) : QObject(parent){ //必须用信号槽形式,不然提示 QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread //估计日志钩子可能单独开了线程 connect(this, SIGNAL(send(QString)), SendLog::Instance(), SLOT(send(QString))); file = new QFile(this); toNet = false; //默认取应用程序根目录 path = qApp->applicationDirPath(); //默认取应用程序可执行文件名称 QString str = qApp->applicationFilePath(); QStringList list = str.split("/"); name = list.at(list.count() - 1).split(".").at(0); fileName = "";}SaveLog::~SaveLog(){ file->close(); }//安装日志钩子,输出调试信息到文件,便于调试void SaveLog::start(){#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) qInstallMsgHandler(Log);#else qInstallMessageHandler(Log);#endif}//卸载日志钩子void SaveLog::stop(){#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) qInstallMsgHandler(0);#else qInstallMessageHandler(0);#endif}void SaveLog::save(const QString &content){ //如果重定向输出到网络则通过网络发出去,否则输出到日志文件 if (toNet) { emit send(content); } else { //方法改进:之前每次输出日志都打开文件,改成只有当日期改变时才新建和打开文件 QString fileName = QString("%1/%2_log_%3.txt").arg(path).arg(name).arg(QDATE); if (this->fileName != fileName) { this->fileName = fileName; if (file->isOpen()) { file->close(); } file->setFileName(fileName); file->open(QIODevice::WriteOnly | QIODevice::Append | QFile::Text); } QTextStream logStream(file); logStream << content << "n"; }} 三、效果图
到此,相信大家对"Qt日志重定向输出类怎么使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
日志
输出
支持
程序
文件
钩子
存储
信息
文本
版本
项目
内容
功能
大部分
应用程序
数据
数据库
线程
网络
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器安装需要的配置
黄石 网络安全
链接数据库select
外部并数据库
软件开发运维一般占比多少
sra数据库
etl抽取sap数据库
三级网络技术考试时间
达梦数据库修改字段的sql语句
网络安全教育手抄报五年级
怎样查看sql数据库项目名称
ps5连接服务器不见了
中电云网络技术服务有限公司
软件开发石家庄勒泰
教你随意复制网吧服务器上的电影
idea怎么选择应用程序服务器
39岁网络技术员去养老院
节点数存储到数据库
服务器建系统发育树
为了保障服务器上数据的安全
支付宝网络技术有限公司是飞猪吗
服务器安装系统选择哪种模式
巨灵金融数据库
软件开发生存链
软件开发外包价钱
如何把服务器弄成游戏服务器
有海外服务器的手游
软件开发的监视和测量记录
剪影提取音乐服务器正在升级
连不上内网数据库