温馨提示×

linux如何抓取golang日志

小樊
47
2026-10-23 01:38:02
栏目: 编程语言

在 Linux 上“抓取 Golang 日志”通常分几种场景,下面按常见需求给你一套实用方案。


一、Golang 程序本身的日志来源

Go 程序日志一般来自:

  1. log / logrus / zap 等库输出到 stdout / stderr
  2. 输出到 日志文件
  3. 使用 syslog / journald

二、如果是 stdout / stderr(最常见)

1️⃣ 直接运行并保存日志

./myapp > app.log 2>&1

2️⃣ 后台运行 + 日志抓取

nohup ./myapp > app.log 2>&1 &

3️⃣ 实时查看

tail -f app.log

三、如果是 systemd 服务(推荐生产环境)

Go 程序作为 systemd 服务

# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal
StandardError=journal

抓取日志

journalctl -u myapp -f

查看历史:

journalctl -u myapp --since "2024-01-01" --until "2024-01-02"

四、使用 grep / awk 过滤 Golang 日志

按关键字抓

journalctl -u myapp | grep ERROR

实时过滤

tail -f app.log | grep -i error

提取时间 + 错误

awk '/ERROR/ {print $1, $2, $0}' app.log

五、Golang 程序内增强日志(更容易抓)

示例(log 标准库)

log.SetFlags(log.LstdFlags | log.Lshortfile)

推荐日志库

  • logrus
  • zap(高性能)
  • slog(Go 1.21+ 官方)

六、高级:集中式日志抓取

如果是 多服务 / 容器 / 生产环境:

  • Filebeat + ELK
  • Fluentd + Loki
  • Promtail + Loki + Grafana

示例(Docker):

logging:
  driver: json-file
  options:
    max-size: "100m"

七、常见坑提醒 ⚠️

  1. Go 默认日志不带时间戳(用 log.SetFlags)
  2. stderr 和 stdout 要分开抓
  3. 容器里要 logs 到 stdout,不要写文件
  4. 日志级别要明确(INFO/WARN/ERROR)

如果你能补充:

  • ✅ Go 程序怎么跑的(裸进程 / systemd / Docker / K8s)
  • ✅ 日志现在输出到哪
  • ✅ 想“实时抓”还是“查历史”

我可以直接给你精确命令或配置。

0 踩