温馨提示×

Golang日志在CentOS中如何进行故障排查

小樊
40
2026-01-02 06:57:30
栏目: 编程语言

在 CentOS 上排查 Golang 应用日志的实用流程


一 快速定位与实时查看

  • 确认日志路径与输出方式:应用常把日志写到**/var/log/或通过systemd记录到journald**。优先查看对应路径或运行命令:
    • 实时查看文件日志:tail -f /var/log/myapp.log
    • 查看 systemd 日志:journalctl -u myapp.service -f
  • 关键字检索与时间段过滤:
    • 查找错误:grep -n “ERROR/var/log/myapp.log
    • 统计行数:wc -l /var/log/myapp.log
    • 时间窗口:awk ‘/2026-01-02 10:00:00/,/2026-01-02 10:30:00/’ /var/log/myapp.log
  • 若为 Web 服务访问日志,可用GoAccess快速出报表(适合 Nginx/Apache 访问日志,也可用于结构化业务日志的终端可视化):
    • 安装:yum install -y goaccess
    • 生成报告:goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format COMBINED --real-time-html

二 应用侧日志配置与结构化

  • 使用标准库 log输出到标准输出,便于被 systemd 或容器捕获:
    • log.SetOutput(os.Stdout)
    • log.SetFlags(log.LstdFlags | log.Lshortfile)
  • 使用logrus输出结构化 JSON,便于检索与聚合:
    • logrus.SetFormatter(&logrus.JSONFormatter{})
    • logrus.SetLevel(logrus.DebugLevel / InfoLevel / WarnLevel / ErrorLevel)
  • 使用zap高性能结构化日志(生产推荐):
    • logger, _ := zap.NewProduction(); defer logger.Sync()
    • logger.Info(“msg”, zap.Error(err), zap.String(“module”,“auth”))
  • 建议做法:在开发/排障阶段开启DEBUG,上线后调回INFO/WARN/ERROR;统一日志字段(如request_id、trace_id、module、host)。

三 运行环境与日志轮转

  • systemd托管应用并统一采集 stdout/stderr:
    • StandardOutput=append:/var/log/myapp.log
    • StandardError=append:/var/log/myapp.err.log
    • 然后用 journalctl -u myapp.service -f 或 tail -f 跟踪
  • 使用logrotate防止日志过大(创建 /etc/logrotate.d/myapp):
    • /var/log/myapp/*.log {
      • daily
      • missingok
      • rotate 7
      • compress
      • notifempty
      • create 0640 root root
    • }
  • 权限与安全:日志目录与文件建议设置为0640,属主root:root,避免敏感信息泄露。

四 集中化收集与可视化

  • 使用Fluentd采集并发送到Elasticsearch,在 Kibana 中检索与可视化:
    • /etc/fluent/fluent.conf 片段:
      • @type tail - path **/var/log/myapp/*.log** - pos_file **/var/log/fluentd-myapp.log.pos** - tag **myapp** - @type **none**
      • <match myapp.**> @type elasticsearch
        • host localhost
        • port 9200
        • logstash_format true
        • flush_interval 10s
    • 启动:systemctl start fluentd && systemctl enable fluentd
  • 也可采用Logstash直接读文件并写入 Elasticsearch,在 Kibana 建立索引与仪表盘。

五 错误追踪与性能联动排查

  • 接入Sentry等错误追踪服务,捕获异常堆栈与上下文:
    • sentry.Init(sentry.ClientOptions{Dsn: “your_dsn”})
    • defer sentry.Flush(2 * time.Second)
    • 触发 panic 或记录 error 时自动上报
  • 性能问题联动:开启 pprof 定位瓶颈
    • 导入 _ “net/http/pprof”
    • 启动调试服务:go func(){ http.ListenAndServe(“localhost:6060”, nil) }()
    • 浏览器访问 http://localhost:6060/debug/pprof/ 或使用 go tool pprof 分析。

0