📁 文件功能一览表
- 底层基础 timestamp.hpp/cpp - 时间工具
获取当前时间、格式化时间字符串
用于给每条日志打时间戳
appendfile.hpp/cpp - 文件写入器
最底层的文件操作
使用缓冲区批量写文件
性能关键:fwrite_unlocked
- 日志消息构建 logcommon.hpp/cpp - 常量定义
日志级别枚举:TRACE、DEBUG、INFO...
缓冲区大小常量
logmessage.hpp/cpp - 单条日志消息
包含:时间、级别、文件名、行号、内容
支持 << 流式操作符:LOG_INFO << "msg"
- 文件管理 logfile.hpp/cpp - 日志文件管理器
控制日志文件滚动(按大小/按时间)
决定何时创建新文件
调用 appendfile 实际写文件
- 异步核心 countdownlatch.hpp/cpp - 线程同步工具
简单的"倒计时门闩"
让主线程等子线程启动完成
asynlogging.hpp/cpp - 异步日志引擎 ⭐️ 最复杂
前端:接收日志消息 → 存入当前缓冲区
后端:定时将缓冲区写入文件
生产者-消费者模式
- 用户接口 logger.hpp/cpp - 用户使用的接口
提供宏:LOG_INFO、LOG_ERROR
设置全局日志级别
调用 asynlogging 或直接输出
🔗 核心数据流(一句话逻辑) text 用户代码 ↓ LOG_INFO << "hello" logger (接口层) → 调用输出函数 ↓ asynlogging (异步层) → 前端:收消息 → 后端:写文件 ↓ logfile (文件管理层) → 检查是否要滚动文件 ↓ appendfile (文件写入层) → 实际写入磁盘 🎯 五个核心概念
- 双缓冲区(asynlogging的核心) text 前端线程写 → [当前缓冲区 currentbuffer_] 后端线程读 → [待写队列 buffers_] → 批量写入文件
- 文件滚动(logfile的核心) 按大小:文件超过128KB → 新文件
按时间:每天零点 → 新文件
文件名:app.20240101-120000.hostname.pid.log
- 流式接口(logger的核心) cpp LOG_INFO << "user" << user_id << "login"; // 等价于: // 构建字符串"user 123 login" // 交给asynlogging处理
- 异步处理(关键优化) 前端:只写内存缓冲区,不阻塞
后端:定时批量写磁盘,减少IO次数
- 线程安全 logger:单线程写缓冲区
asynlogging:mutex保护缓冲区交换
logfile:可选是否加锁
🔄 启动流程 用户调用 asynlogging.start()
启动后台线程(消费者)
用户调用 LOG_INFO
消息存入当前缓冲区
后台线程定时取出缓冲区写入文件
🛑 停止流程 设置 running_ = false
唤醒后台线程
写入剩余日志
关闭文件
💡 一句话总结每个文件 text timestamp : 获取和格式化时间 appendfile : 高效写文件 logfile : 管理文件滚动 asynlogging : 异步处理日志(核心引擎) logger : 用户使用的接口(LOG_XXX宏) logmessage : 构建单条日志 //logcommon : 定义常量和枚举 countdownlatch: 线程启动同步