警告
- 使用QT的qInstallMessageHandler函数结合qDebug,qInfo实现自定义的日志系统
- 输出日志到文件和控制台
- 自动检测日志文件大小
- 自动更新日志文件修改日期
- 自动备份
- 自动删除一个月前的日志文件
- 支持多线程程序
- 支持扩展,可输出日志到数据库,网络,或服务器
- 支持扩展,可使用config文件进行配置
开发环境
- 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助
- 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
- 注:本人文章非盈利性质,若有侵权请联系我删除
- 注:获取资源或者咨询问题请联系Q:2950319782
- 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
- 注:我会一步步分享实现的细节,若仍有问题联系我
GitHub
- win10系统
- qtcreator4.11.1
- C++11
- QT5.14.2
问题解决
- GitHub下 的Log文件
- 若不能访问GitHub,源码的资源包会随文章同步发布,免费下载
- 资源包较GitHub更新不及时,请谅解
需求
结构
- 输出日志信息到日志文件
- 更新日志的修改日期
- 日志文件超过一定大小备份老的创建新的
- 删除一个月前的日志文件
思路
关键代码
- 随便创建一个widget程序,放个测试按钮
- 主要思路是使用 qInstallMessageHandler()接管qDebug(), qWarning()等调试信息,然后将信息流存储至本地日志文件,并管理日志文件
- 先创建一个MyLog的类,在这里面我们实现自定义的日志系统
- 这里依然是使用单例实现,整个程序的日志应该只能有一个
- 首先实现单例getInstance获取MyLog的实例
- 下面处理MyLog的构造函数,每一次启动日志系统,都要先设置日志文件的路径,然后更新修改日期,然后打开并备份老的日志文件,打开之后,每10分钟刷新日志文件,每1秒都将信息输出到日志,
- 下面实现这个打开并备份老的日志文件的功能openAndBackupLogFile,这里我们的日志文件以天为单位,先处理一天内多次启动日志系统的情况,以追加的方式写入到日志文件里即可;如果程序运行的时候,日志系统的日期和程序运行日期不统一,同步日志日期为程序运行日期,生成新的日期日志,并且备份老的日志
- 然后实现处理日志文件过大的问题,只要日志文件超限,备份老的,创建新的即可
- 然后实现自动删除超时的日志文件,每次启动日志系统的时候,以当前时间为基准,计算出1个月前的时间,遍历日志目录下的所有日志文件,因为日志文件都以时间命名,删除超过1个月的日志文件即可
- 最后,我们只需要处理信息函数即可,捕获系统中的各种输出信息,输出到文件即可
MyLog.cpp复制代码
- #ifndef MYLOG_H
- #define MYLOG_H
- #include <iostream>
- #include <QDateTime>
- #include <QMutexLocker>
- #include <QDir>
- #include <QTimer>
- #include <QTextStream>
- //最大保存文件大小
- const int g_logLimitSize = 5;
- class MyLog
- {
- public:
- MyLog();
- ~MyLog();
- static MyLog* getInstance();
- //消息处理函数
- static void messageHandler(QtMsgType type,
- const QMessageLogContext& context,
- const QString& msg);
- public:
- //打开并备份之前的日志文件
- void openAndBackupLogFile();
- void checkLogFiles();
- void autoDeleteLog();
- //安装消息处理函数
- void installMessageHandler();
- //卸载消息处理函数,并释放资源
- void uninstallMessageHandler();
- private:
- //日志文件夹目录
- QDir logDir;
- //重命名日志文件使用的定时器
- QTimer renameLogFileTimer;
- //刷新输出到日志文件的定时器
- QTimer flushLogFileTimer;
- //日志文件的创建时间
- QDate logFileCreateDate;
- //日志文件
- static QFile* logFile;
- //输出日志
- static QTextStream* logOut;
- //日志锁
- static QMutex logMutex;
- static QScopedPointer<MyLog> self;
- };
- #endif // MYLOG_H
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |