Systems / Logging
日志系统设计记录
日志不是越多越好,真正有用的是能回答“什么时候、哪个连接、在哪个阶段、发生了什么”。
字段
最小字段包括时间、级别、模块、连接 fd、消息。连接类问题最好带上 peer address 或 request id,否则多连接并发时很难复盘。
级别
DEBUG 记录细节,INFO 记录关键状态变化,WARN 记录可恢复异常,ERROR 记录需要处理的失败。开发阶段可以打开 DEBUG,公开运行时默认 INFO。
输出位置
早期可以直接输出到 stderr 或文件。等服务器稳定后,再考虑异步日志队列,避免日志 IO 阻塞 worker。
示例
2026-05-15 11:30:02 INFO conn=42 parser request complete path=/notes/modern-cpp.html
2026-05-15 11:30:02 DEBUG conn=42 writer sent=4096 remain=1280
2026-05-15 11:30:03 WARN conn=42 peer closed before response complete
日志粒度
日志应该服务排查问题,而不是制造噪声。连接生命周期、请求路径、状态码、读写错误、异常关闭这些节点值得记录;每次循环都打印则很快会淹没关键信息。
推荐格式
2026-05-15 12:08:31 INFO conn=18 request path=/notes/linux-notes.html
2026-05-15 12:08:31 DEBUG conn=18 write sent=4096 remain=2048
2026-05-15 12:08:32 WARN conn=18 peer closed