温馨提示×

debian下如何抓取golang日志

小樊
38
2026-09-22 09:55:36
栏目: 编程语言

在 Debian 下抓取(收集、查看、导出)Golang 程序日志,通常分为查看日志实时抓取日志系统级收集日志几种方式。下面按常见场景说明。


一、Golang 日志在哪里?

Golang 本身不强制日志位置,常见情况:

  1. 直接输出到 stdout / stderr
    log.Println("hello")
    
  2. 写入文件
    log.SetOutput(os.OpenFile("/var/log/app.log", ...))
    
  3. 使用日志库
    • logrus
    • zap
    • slog(Go 1.21+)

二、最基础:直接查看日志

1. 前台运行(stdout)

./yourapp

2. 后台运行并保存

nohup ./yourapp > /var/log/app.log 2>&1 &

查看:

tail -f /var/log/app.log

三、systemd 下抓取 Golang 日志(推荐)

如果你用 systemd 管理 Golang 服务:

1. 编辑 service

[Unit]
Description=Go App

[Service]
ExecStart=/opt/app/yourapp
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

2. 查看日志

journalctl -u yourapp.service

实时查看:

journalctl -u yourapp.service -f

按时间:

journalctl -u yourapp --since "2024-01-01 00:00"

导出日志:

journalctl -u yourapp > app.log

四、实时抓取(tail / grep)

tail -f /var/log/app.log

过滤 ERROR:

tail -f /var/log/app.log | grep ERROR

五、使用 logrotate 管理日志(防爆盘)

/etc/logrotate.d/goapp

/var/log/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

六、进阶:集中采集日志(生产环境)

方案 1:rsyslog

Golang 输出到 local0:

log.SetOutput(os.Stdout)

rsyslog 配置:

if ($programname == "yourapp") then {
    action(type="omfile" file="/var/log/yourapp.log")
}

方案 2:Filebeat / Fluent Bit

适合 ELK / Loki:

  • Golang → 文件
  • Filebeat → Elasticsearch / Kafka

七、调试技巧

查看 Golang 崩溃

dmesg | grep yourapp
journalctl -xe

捕获 panic

defer func() {
    if r := recover(); r != nil {
        log.Println("panic:", r)
    }
}()

总结

场景 方法
简单查看 tail -f
服务化 systemd + journalctl
生产环境 logrotate + filebeat
调试 journalctl -u

如果你能告诉我:

  • Golang 是怎么运行的(systemd / docker / 裸跑)
  • 日志是文件还是 stdout

我可以给你更精确的命令。

0