在 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 分析。