feat: harden logger lifecycle and add tests
This commit is contained in:
@@ -1,68 +1,59 @@
|
||||
## 概述
|
||||
# MyLogger
|
||||
|
||||
- Singleton.h
|
||||
MyLogger 是用于 Qt 程序的进程级日志模块,接管 `qDebug()`、`qInfo()`、`qWarning()`、`qCritical()` 和 `qFatal()`。
|
||||
|
||||
懒汉模式的单例模板类
|
||||
## 行为
|
||||
|
||||
- loghandler.h/cpp
|
||||
- 默认写入 `{applicationDirPath}/logs`,日志文件名为 `yyyy-MM-dd_进程号_分卷号.log`。
|
||||
- 单个文件最大 10 MiB,达到上限自动创建下一个分卷;仅清理本模块生成且超过 30 天的日志。
|
||||
- 普通日志最多每秒 flush 一次;`qCritical()` 和 `qFatal()` 会立即 flush。
|
||||
- 安装时保存此前的 Qt 消息处理器,卸载时恢复它。Qt 每个进程只能有一个全局消息处理器,安装期间不要由其他模块再次调用 `qInstallMessageHandler()`。
|
||||
|
||||
日志类
|
||||
## qmake:链接动态库
|
||||
|
||||
- MyLogger.pri
|
||||
先构建 `MyLogger.pro`,然后在宿主工程中链接生成的库并包含头文件。不要再包含 `MyLogger.pri`。
|
||||
|
||||
子模块qt pri文件
|
||||
```pro
|
||||
LIBS += -L$$PWD/Libs/MyLogger/build -lMyLogger
|
||||
INCLUDEPATH += $$PWD/Libs/MyLogger
|
||||
```
|
||||
|
||||
## 使用
|
||||
## qmake:源码嵌入
|
||||
|
||||
### 克隆代码
|
||||
|
||||
克隆代码并复制到工程Libs目录下
|
||||
|
||||
### 添加子工程
|
||||
|
||||
在主工程pro文件中,添加:
|
||||
不单独构建动态库时,可在宿主 `.pro` 中使用:
|
||||
|
||||
```pro
|
||||
include($$PWD/Libs/MyLogger/MyLogger.pri)
|
||||
```
|
||||
|
||||
### 使用
|
||||
源码嵌入与链接动态库只能二选一。
|
||||
|
||||
#### 日志使用
|
||||
## 使用
|
||||
|
||||
```c++
|
||||
#include <QApplication>
|
||||
//头文件
|
||||
在 `Q(Core)Application` 创建后、需要记录第一条 Qt 日志前安装;应用退出前卸载。
|
||||
|
||||
```cpp
|
||||
#include "loghandler.h"
|
||||
int main(int argc, char *argv[])
|
||||
|
||||
if (!LogHandler::Get().installMessageHandler())
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
//安装
|
||||
LogHandler::Get().installMessageHandler();
|
||||
Debug() << "Hello";
|
||||
qDebug() << "当前时间是: " << QTime::currentTime().toString("hh:mm:ss");
|
||||
qInfo() << QString("God bless you!");
|
||||
//卸载
|
||||
LogHandler::Get().uninstallMessageHandler();
|
||||
return a.exec();
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 单例模板类使用
|
||||
|
||||
```c++
|
||||
#include "Singleton.h"
|
||||
class AppConfig : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
//通过宏
|
||||
SINGLETON(AppConfig);
|
||||
.....
|
||||
// 日志目录不可用;应用可继续运行,也可在权限恢复后再次尝试安装。
|
||||
}
|
||||
|
||||
qInfo() << "application started";
|
||||
|
||||
LogHandler::Get().uninstallMessageHandler();
|
||||
```
|
||||
|
||||
## 单元测试
|
||||
|
||||
`tests/MyLoggerTests.pro` 使用 QtTest 直接编译日志源码,并通过仅测试可见的 `MYLOGGER_TESTING` 访问类把日志写入临时目录。
|
||||
|
||||
```powershell
|
||||
cd Libs/MyLogger/tests
|
||||
qmake MyLoggerTests.pro
|
||||
mingw32-make -j12
|
||||
.\release\MyLoggerTests.exe
|
||||
```
|
||||
|
||||
测试覆盖安装失败后的重试、旧 handler 恢复、UTF-8 内容、并发写入、分卷与过期日志清理。CMake 使用 `-DBUILD_TESTING=ON` 后可通过 `ctest` 执行同一套用例。
|
||||
|
||||
Reference in New Issue
Block a user