CentOS 环境下 Golang 日志监控实用技巧
一 快速排查与命令行组合
- 实时查看日志:使用 tail -f /path/to/app.log 跟踪最新输出,适合临时排查与观察启动过程。
- 关键字过滤:用 grep ‘error’ /path/to/app.log 精准定位错误;结合 -v 反向过滤,或用 -i 忽略大小写。
- 时间窗口分析:用 awk ‘/2025-12-09 10:00:00/,/2025-12-09 10:30:00/’ /path/to/app.log 抽取某段时间日志,便于还原故障现场。
- 统计与去重:用 wc -l 统计行数;配合 sort | uniq -c 做错误频次统计。
- systemd 服务日志:若应用以 systemd 托管,使用 journalctl -u your-service.service -f 实时查看,并可加 –since today 限定时间范围。
二 应用侧日志最佳实践
- 使用结构化日志库:优先选择 zap 或 logrus,便于检索与聚合。示例(logrus 输出 JSON):
- logger := logrus.New(); logger.SetFormatter(&logrus.JSONFormatter{}); logger.SetOutput(os.Stdout); logger.SetLevel(logrus.InfoLevel)
- 输出到文件并控制权限:
- logFile, _ := os.OpenFile(“/var/log/myapp.log”, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); log.SetOutput(logFile)
- 接入 syslog:便于与 journald 统一收集与转发。示例(logrus-syslog):
- hook, _ := lfshook.NewSyslogHook(“local0”, “”, logrus.DebugLevel); log.AddHook(hook)
- 暴露指标配合监控:在 HTTP 服务中添加 /metrics 端点,配合 Prometheus 抓取,用 Grafana 可视化。
三 日志轮转与保留策略
- 使用 logrotate 管理日志生命周期,建议创建 /etc/logrotate.d/myapp:
- /var/log/myapp.log { daily; missingok; rotate 7; compress; notifempty; create 640 root root }
- 关键参数说明:
- daily:按天轮转;rotate 7:保留最近 7 份;compress:压缩归档;create:轮转后重建文件并设定权限与属主。
四 集中式日志与可视化
- 轻量方案 Loki + Promtail:Golang 输出结构化日志(JSON),Promtail 采集并发送到 Loki,在 Grafana 用 LogQL 查询与告警,资源占用低、部署简单。
- 重量方案 ELK/EFK:Elasticsearch 存储与检索、Logstash/Kibana 处理与可视化,适合复杂查询、全文检索与合规审计。
- 日志收集器 Fluent Bit:轻量采集器,支持 tail 输入与多输出(如 syslog、ES、Loki),易与容器/主机集成。
五 告警与自动化响应
- 指标告警链路:Prometheus 抓取应用指标(如 http_requests_total、http_request_latency_ms),Alertmanager 做分组、抑制与静默,通过邮件、企业微信、钉钉或 Webhook 通知。
- 日志关键字告警:在主机侧用 grep/awk 组合检测高频错误并触发脚本(如调用 Webhook 发告警),适合无集中式日志栈时的快速兜底。
- 日志到 syslog 再统一处理:应用通过 logrus-syslog 写 syslog,再由 Fluent Bit 或 rsyslog 转发至 Loki/ES,在统一平台配置告警规则。