在 CentOS 上高效管理 Golang 日志的实用方案
一 日志库选择与输出格式
- 标准库 log:适合简单场景,使用 log.SetOutput 定向到 stdout/stderr 或文件,配合 log.SetFlags 输出时间戳、文件名与行号。生产环境建议结构化日志以便检索与分析。
- logrus:上手快,支持分级与 JSON/Text 格式,易扩展 Hook。
- zap:Uber 开源,高性能、结构化日志,生产推荐;支持原子级别动态调整。
- zerolog:零分配 JSON,极致性能。
- 建议:开发环境用 Text/Debug,生产环境用 JSON/Info,并统一包含 ts、level、msg、caller 等字段。
二 输出到 systemd 与 rsyslog 的集中管理
- 使用 systemd 托管进程时,推荐将日志写到 stdout/stderr,由 journald 统一采集:
- 查看服务日志:sudo journalctl -u your.service;实时跟踪:sudo journalctl -u your.service -f;本次启动:sudo journalctl -b。
- 如需对接 rsyslog 做网络集中或按设施/优先级分流:
- 启用接收:sudo yum install rsyslog -y,在 /etc/rsyslog.conf 中加载模块(如 imudp/imtcp)并开放 514 端口;重启:sudo systemctl restart rsyslog && sudo systemctl enable rsyslog。
- 若程序直写文件,也可用 rsyslog 按路径匹配规则转发到远程日志中心。
三 日志轮转与保留策略
- 使用系统 logrotate 管理按大小/时间的轮转与压缩,避免单文件过大:
- 示例 /etc/logrotate.d/myapp:
- 按天轮转、保留 7 天、压缩、忽略缺失、仅非空:
- daily; rotate 7; compress; missingok; notifempty
- 可按需增加 size、dateext、postrotate 通知应用重开文件句柄。
- 在程序内使用 lumberjack 实现按文件大小滚动(适合容器/不可信环境):
- 典型参数:MaxSize=100(MB)、MaxBackups=7、MaxAge=28(天)、Compress=true。
- 建议:systemd 场景优先用 journald 管理;直写文件场景用 logrotate;二者不要对同一日志文件并行写入。
四 动态级别与运行时控制
- 通过环境变量设置日志级别,无需改代码与重启:
- 示例(logrus):
- level, _ := logrus.ParseLevel(os.Getenv(“LOG_LEVEL”))
- logrus.SetLevel(level)
- 运行前导出:export LOG_LEVEL=debug && ./your_app。
- 使用 zap 的 AtomicLevel 在运行中动态升降级(生产热调节奏与采样策略)。
五 快速落地清单与最小示例
- 最小可用方案(systemd + journald + 结构化日志):
- 程序输出 JSON 到 stdout/stderr,包含 ts、level、msg、caller;用 journalctl -u your.service -f 实时查看;按天用 logrotate 轮转应用文件日志(如有)。
- 最小示例(zap + 环境变量 + 文件回滚):
- 代码示例:
- 使用 zap.NewProduction 或自定义 zap.Config(设置 Encoding=json、Level=AtomicLevel、OutputPaths=[“stdout”]),并在需要时加入 lumberjack 写入 /var/log/myapp.log(参数:MaxSize=100、MaxBackups=7、MaxAge=28、Compress=true)。
- 运行前导出级别:export LOG_LEVEL=debug;查看日志:sudo journalctl -u your.service -f。