Shiny
是基于mmap的Linux
轻量级日志模块。它的核心是通过mmap
对文件进行映射一片固定大小的内存空间, 并且通过该内存空间进行日志的高速缓存, 最终通过write
进行日志的写入。mmap
对日志进行持久化的高速缓存, 保证了日志的高可靠性, 即不丢失日志。
项目提供了简单的日志接口, 主要包括:获取单例的logger
、配置日志文件路径、设置日志等级等。
站在巨人的肩膀上。Shiny
项目参考微信官方的跨平台跨业务终端基础组件mars中的xlog
日志模块, 对xlog
进行了裁剪和重构, 并且完善了项目文档。
更多关于mmap
、xlog
、Shiny
的相关知识, 参考Shiny的文档
根据微信官方对xlog
的介绍和源码阅读, xlog
并未对日志文件进行直接映射, 通过内核对dirty page
的持久化策略进行日志的IO, 而是基于mmap
映射了一块高速的、持久化的高速缓存, 最终通过后台线程进行该高速缓存的读取,并且通过write
进行日志的写入。
项目的可改进策略:通过mmap
直接映射固定大小的日志文件, 并对该mmap
映射射的内存进行读写的并发控制
- 基于
mmap
的高速日志缓冲区, 保证进程crash时不丢失日志 - 基于
zlib
的日志压缩,封装了zlib压缩的基本使用方法 - 面向现代的
C++11
开发风格, 充分利用C++11
新特性,包括RAII
、thread
库、条件变量等 - 可拓展的日志加密、解密功能
- Linux环境
- cmake >= 3.20.2
- gcc、gcc-c++
- make
- kernel-devel
- zlib
$ sudo yum install make automake gcc gcc-c++ kernel-devel
$ git clone [email protected]:Mapshiny/Shiny.git
$ cd Shiny/lib
$ tar -zxvf zlib-1.2.12.tar.gz && cd zlib-1.2.12/ // 解压zib
$ ./configure // 配置zlib
$ sudo make install // 编译zlib
$ cd ../..
$ mkdir build bin
$ cd build && cmake ..
$ make
$ cd sample
$ mkdir build bin
$ cd build && cmake ..
$ make
$ ../bin/benchmark
-
mmap
-
Shiny基本使用
-
sample
待续...
项目仍有很多待完善的地方, 其中已知的有:
- 异常处理不恰当可能会造成内存泄漏。代码中的
malloc
可能出现分配内存失败的情况,需要进行适当的处理,建议进行roll back
,Shiny
仅仅抛出了bad alloc
而未处理
更多潜在的逻辑、bug有待排查和改进
感谢 Visual Studio Code, Copilot...