# mylog **Repository Path**: blueLotu/mylog ## Basic Information - **Project Name**: mylog - **Description**: No description available - **Primary Language**: Unknown - **License**: LGPL-2.1 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-18 - **Last Updated**: 2026-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mylog - High-Performance C++ Logging Library 基于 Qt 5.15 + C++17 的高性能日志库,支持同步/异步模式、自动文件分片(时间+大小)、纯 C++ 核心层与 QT 适配层分离。 ## 架构 ``` mylog_core (Pure C++17, zero Qt dependency) └── mylog (Qt 5.15 adapter layer) ``` - **核心层**:后台纯 C++ 服务可直接链接 `mylog_core` - **QT 适配层**:前端 QT 插件链接 `mylog`(依赖 Qt + mylog_core) ## 快速开始 ### 纯 C++ 使用(无 Qt) ```cpp #include "mylog/core/logger.h" #include "mylog/core/sinks/console_sink.h" #include "mylog/macros/log_macros.h" using namespace mylog::core; int main() { auto& logger = Logger::get("app"); logger.setLevel(LogLevel::DEBUG); logger.addSink(std::make_unique()); LOG_INFO() << "Application started"; LOG_DEBUG() << "Debug value: " << 42; LOG_ERROR() << "Something went wrong!"; logger.flush(); return 0; } ``` ### 流式写法(core,无需 Qt) core 层统一用 `<<` 运算符链式写日志(无需格式化占位符,括号内不接受参数)。行号与函数名会自动带上: ```cpp #include "mylog/macros/log_macros.h" LOG_INFO() << "user " << id << " logged in"; // 默认日志实例 LOG_DEBUG_TO("net") << "cache miss key=" << key; // 具名日志实例 // 向指定日志实例写(同样自动带源位置) LOG_ON(logger, WARN) << "retry " << n; ``` 所有日志输出**自动包含 时间、级别、线程、代码行:函数名、消息**,例如: ``` [2026-07-24 21:06:16.906] [info] [134398] [main.cpp:42:doWork] user 1001 logged in ``` > **注意:正常使用不需要自定义 `ISink` 派生类。** 直接用内置 sink(`createConsoleSink` > / `createFileSink` / `createRotatingFileSink` / `createDailyFileSink`)挂到 logger 上, > 然后 `LOG_INFO() << ...` 即可,跟测试代码里为了断言日志内容而写的 `ISink` 派生类 > (比如捕获到内存里再校验)无关,那只在需要扩展全新输出目标(自定义协议、UI 控件等)时才需要。 ```cpp auto& logger = Logger::get("app"); logger.setLevel(LogLevel::TRACE); logger.addSink(createConsoleSink(false)); // 内置 sink → stdout logger.addSink(createFileSink("logs/app.log", true)); // 内置 sink → 文件(追加) LOG_INFO() << "这是 INFO 级别 — 关键业务流程, value=" << 42; ``` ### Qt 使用(流式宏) ```cpp #include "mylog/adapters/mylog_logger.h" #include "mylog/macros/mylog_macros.h" QLOG_INFO() << "Plugin initializing..."; QLOG_DEBUG() << "Current value:" << value; QLOG_ERROR() << "Error:" << errorMessage; ``` ### 重定向 Qt 原生日志(qDebug) `QtLogRedirector` 可把 `qDebug()`/`qWarning()` 等 Qt 原生日志统一接入 mylog,输出**自动包含行号+函数名**(调用方 `qDebug() << ...` 照常写,无需改动): ``` [2026-07-24 21:06:16.906] [debug] [12345] [widget.cpp:88:onClick] [QtDebug] clicked ``` > 说明:Qt 仅在定义了 `QT_MESSAGELOGCONTEXT` 的编译单元里才会在调用点采集文件/行号/函数(默认只在 debug 构建开启)。 > - **CMake 使用方**:链接 `mylog` 即自动继承该定义(`mylog` 已 `PUBLIC` 声明),**release 也带行号/函数**,零改动。 > - **qmake / 手动编译的使用方**:需在自己的构建里加 `DEFINES += QT_MESSAGELOGCONTEXT`(或 `-DQT_MESSAGELOGCONTEXT`);否则 release 下 `qDebug` 的行号/函数会缺失。 ## 特性 - **流式写法**:`LOG_INFO() << ...`,core 层零 Qt 依赖 - **自动源位置**:所有日志输出自动带 时间 + 代码行号 + 函数名,无需调用方手动传入 - **高性能异步日志**:lock-free queue + 预分配内存池,热路径 <500ns - **自动文件分片**:按大小 / 按时间 / 混合分片 - **QT 信号槽集成**:日志实时显示到 UI 控件 - **编译期优化**:`MYLOG_DISABLE` 宏可完全消除日志代码 - **双模式**:同步直写 / 异步后台写入 ## 文件分片示例 ```cpp // 按大小分片:100MB/文件,保留10个 auto sink = std::make_unique("app.log", 100*1024*1024, 10); // 按时间分片:每天 00:00 auto sink = std::make_unique("app.log", 0, 0, 30); // 混合分片 auto hybrid = std::make_unique(); hybrid->addPolicy(std::make_unique(100_MB)); hybrid->addPolicy(std::make_unique(24, 0)); ``` ## 构建 构建产出两个库: - **`mylog_core`** — 纯 C++17,零 Qt 依赖(后台纯 C++ 服务使用) - **`mylog`** — 依赖 Qt 5.15 + mylog_core(前端 Qt 插件使用) ### 手动编译 (MinGW / GCC) ```bash # 1. 编译核心库 g++ -std=c++17 -DMYLOG_CORE_LIBRARY -shared -I include \ src/core/*.cpp src/core/sinks/*.cpp src/core/rotation/*.cpp \ -o build/mylog_core.dll # 2. 运行 moc(Qt 元对象编译器) moc include/mylog/adapters/mylog_logger.h -o build/moc_mylog_logger.cpp moc include/mylog/adapters/qt_signal_sink.h -o build/moc_qt_signal_sink.cpp # 3. 编译 Qt 适配库 g++ -std=c++17 -DMYLOG_LIBRARY -shared -I include \ -I $QTDIR/include -I $QTDIR/include/QtCore \ src/adapters/*.cpp build/moc_*.cpp \ -Lbuild -lmylog_core -L$QTDIR/lib -lQt5Core \ -o build/mylog.dll ``` ### CMake ```bash cmake -B build -DCMAKE_BUILD_TYPE=Release -DMYLOG_BUILD_TESTS=ON cmake --build build --parallel cd build && ctest --output-on-failure ``` ### qmake (Qt Creator) ```bash qmake mylog_core.pro && make # 核心库 qmake mylog.pro && make # QT 适配库 ``` ## 项目结构 ``` include/mylog/ ├── core/ # 纯 C++17 核心层 ├── adapters/ # Qt 5.15 适配层 └── macros/ # 日志宏定义 src/ ├── core/ # 核心实现 └── adapters/ # 适配实现 tests/ # 单元测试 (gtest) examples/ # 用户使用示例(按功能独立) design/ # 设计文档(UML + 方案说明) third_party/ # 可选第三方依赖(fmtlib, moodycamel) ``` ## 使用示例 | 示例 | 说明 | |------|------| | `examples/demo_basic` | 基础同步日志(控制台+文件) | | `examples/demo_async_performance` | 异步高性能日志 + 吞吐量统计 | | `examples/demo_rotation_by_size` | 按大小分片(10KB 快速演示) | | `examples/demo_rotation_by_time` | 按时间分片 | | `examples/demo_rotation_hybrid` | 混合分片(大小+时间) | | `examples/demo_qt_plugin` | Qt 插件中使用日志 | | `examples/demo_backend_pure_cpp` | 纯 C++ 后台服务使用 | | `examples/demo_structured_logging` | 结构化键值对日志 | ## 参考 - QsLog: QT Destination 插件模式 - spdlog: 异步高性能 Sink 模式 - moodycamel::ConcurrentQueue: lock-free 队列 - fmtlib: 编译期格式串校验