Skip to content

Mapshiny/Shiny

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Shiny:基于mmap的Linux轻量级日志模块


🐣 前言

Shiny 是基于mmapLinux轻量级日志模块。它的核心是通过mmap对文件进行映射一片固定大小的内存空间, 并且通过该内存空间进行日志的高速缓存, 最终通过write进行日志的写入。mmap对日志进行持久化的高速缓存, 保证了日志的高可靠性, 即不丢失日志。

项目提供了简单的日志接口, 主要包括:获取单例的logger、配置日志文件路径、设置日志等级等。

站在巨人的肩膀上。Shiny项目参考微信官方的跨平台跨业务终端基础组件mars中的xlog日志模块, 对xlog进行了裁剪重构, 并且完善了项目文档。

更多关于mmapxlogShiny的相关知识, 参考Shiny的文档

🚀 架构

根据微信官方对xlog的介绍和源码阅读, xlog并未对日志文件进行直接映射, 通过内核对dirty page的持久化策略进行日志的IO, 而是基于mmap映射了一块高速的、持久化的高速缓存, 最终通过后台线程进行该高速缓存的读取,并且通过write进行日志的写入。

项目的可改进策略:通过mmap直接映射固定大小的日志文件, 并对该mmap映射射的内存进行读写的并发控制

流程图

✨ 特征

  • 基于mmap的高速日志缓冲区, 保证进程crash时不丢失日志
  • 基于zlib的日志压缩,封装了zlib压缩的基本使用方法
  • 面向现代的C++11开发风格, 充分利用C++11新特性,包括RAIIthread库、条件变量等
  • 可拓展的日志加密、解密功能

💎 依赖

  • Linux环境
  • cmake >= 3.20.2
  • gcc、gcc-c++
  • make
  • kernel-devel
  • zlib

⛏️ 构建

$ sudo yum install make automake gcc gcc-c++ kernel-devel

$ git clone git@github.com: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

📚 文档

待续...

📅 TODO

项目仍有很多待完善的地方, 其中已知的有:

  • 异常处理不恰当可能会造成内存泄漏。代码中的malloc可能出现分配内存失败的情况,需要进行适当的处理,建议进行roll backShiny仅仅抛出了bad alloc而未处理

更多潜在的逻辑、bug有待排查和改进

📀 参考资料

  1. 彻底理解mmap()
  2. 微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog
  3. 微信跨平台组件mars-xlog架构分析及迁移思路

🧧 致谢

感谢 Visual Studio Code, Copilot...

About

Shiny:基于mmap的Linux轻量级日志模块

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published