Qt日志重定向输出类怎么使用
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Qt日志重定向输出类怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt日志重定向输出类怎么使用"吧!一、前言用qt开发商业程序已
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
手冲咖啡和咖啡机区别
互联网络科技
上海睿民互联网科技有限公司
互联网科技公司的优势
科技与互联网
金融科技创新监管互联网金融
没上市的科技互联网公司
互联网与未来科技
互联网实体化科技化
深圳市运趣互联网科技有限公司
互联网汽车科技小镇
互联网企业和科技型企业
科技互联网大厂
互联网公司科技股
移动互联网年度科技创新
消费医药和互联网科技
山东星卡互联网科技有限公司官网
杭州披云加互联网科技有限公司
富国互联网科技002692
工业互联网科技成果转化
互联网公司 科技公司
北京互联网科技
互联网科技排名
郑州华宇互联网科技
上海电发互联网科技有限公司
银川新华互联网科技职业技术培训学校图片
深圳无忧互联网科技
卡尔迅互联网科技有限公司
黑龙江互联网科技公司
安徽九吞吴互联网科技有限公司