1. 项目概述
MPRPC项目是一个轻量级的远程过程调用框架开发实践,日志功能作为框架的核心组件之一,其实现质量直接影响着系统的可维护性和问题排查效率。在第十天的开发中,我们重点实现了异步日志系统,通过独立线程处理日志写入,避免阻塞主业务流程。
日志系统在分布式系统中扮演着"黑匣子"的角色。当RPC调用出现超时、数据异常或服务不可用时,完善的日志记录能快速定位问题边界。我在实际开发中发现,一个设计良好的日志系统应该具备三个特性:写入性能不影响主业务、日志内容结构化可分析、支持多级别日志过滤。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日志系统架构设计
2.1 核心组件拆解
日志系统采用生产者-消费者模型,主要包含以下组件:
- 前端接口层:提供LOG_DEBUG/LOG_INFO等宏定义,封装日志级别判断和格式生成
- 异步缓冲队列:环形缓冲区实现,单生产者(主线程)多消费者(日志线程)模式
- 后端写入层:日志线程从队列取出消息,按策略写入文件系统
关键设计决策:选择双缓冲队列而非直接文件写入,实测QPS提升约17倍(测试环境:4核8G云主机,日志量2000条/秒)
2.2 线程安全实现
缓冲队列的线程安全通过以下机制保证:
cpp复制class LogBuffer {
private:
std::mutex m_mutex;
std::condition_variable m_cond;
std::vector<std::string> m_buffers[2]; // 双缓冲
int m_currentBuffer = 0;
};
- 互斥锁保护缓冲区切换操作
- 条件变量实现消费者线程阻塞唤醒
- 双缓冲减少锁竞争(前台缓冲接收新日志,后台缓冲供写入线程处理)
3. 关键实现细节
3.1 日志格式标准化
采用RFC5424标准的syslog格式,包含以下字段:
code复制<优先级>时间戳 主机名 进程ID [线程ID] 文件名:行号 - 消息体
示例输出:
code复制<6>2023-07-20T14:23:45Z server01 28421 [0x7f8b3a5b1700] rpc_controller.cpp:42 - RPC call time
