Qt日志重定向输出类怎么使用
发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,本篇内容主要讲解"Qt日志重定向输出类怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt日志重定向输出类怎么使用"吧!一、前言用qt开发商业程序已
千家信息网最后更新 2024年11月26日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);}QScopedPointerSaveLog::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安全错误
数据库的锁怎样保障安全
安徽银行软件开发
郴州串口服务器价格
海康 服务器 说明
西峡市网络安全宣传活动
微科软件开发有限公司在哪里
阿里巴巴服务器在贵州吗
打开sql数据库备份
数据库共享用户名
wps数据库怎么制作
国际服游戏服务器是多少
艺杰网络技术是哪家公司
scum怎么找好友的服务器
企业网站不需要数据库
服务器运行安全
网络安全工作研讨交流发言材料
南京商邻互联网信息科技
华为mate40网络安全密钥
pt4数据库安装
山东软件开发者价钱
专业软件开发公司哪家好
网络安全电话号码
工业通信应用 网络技术
java更新数据库方法怎么写
MYSQL数据库技术类
前端学习小软件开发
数据库视图的类型
服务器系统用光盘好装么
南庄网络安全
软件开发项目资源计划表
我的世界多人服务器生存第21期