温馨提示×

怎样收集debian golang日志

小樊
46
2026-10-18 20:01:18
栏目: 编程语言

在 Debian 上收集 Golang 应用日志,通常可以从应用自身日志输出方式、系统/服务管理方式以及集中化收集方案三个层面来做。下面按常见场景说明。


一、Golang 应用日志输出方式

1. 输出到 stdout / stderr(推荐)

大多数 Golang 程序(尤其是用 log、log/slog、zap 等)默认输出到标准输出:

log.Println("hello")

在 Debian 上,如果通过 systemd 管理,这些日志会被 journald 收集。

查看日志:

journalctl -u your-service.service -f

2. 输出到日志文件

例如:

log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))

日志文件建议放在:

  • /var/log/myapp/
  • 权限由专用用户持有

查看:

tail -f /var/log/myapp/app.log

二、通过 systemd 收集(最常见)

1. 编写 service 文件

/etc/systemd/system/myapp.service

[Unit]
Description=My Golang App
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

2. 常用日志命令

# 启动
systemctl start myapp

# 查看日志
journalctl -u myapp

# 实时日志
journalctl -u myapp -f

# 最近 100 行
journalctl -u myapp -n 100

三、使用 logrotate 管理日志文件

如果写文件日志,建议配置 logrotate:

/etc/logrotate.d/myapp

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

copytruncate 对不支持信号重开的 Golang 程序很重要。


四、集中化日志收集(生产推荐)

方案 1:rsyslog + 文件

把 Golang 日志写入文件,由 rsyslog 转发。

方案 2:systemd-journald + 采集

  • Filebeat
  • Vector
  • Fluent Bit

示例(Filebeat):

filebeat.inputs:
- type: journald
  units: ["myapp.service"]

五、Golang 日志库建议

  • 标准库:log(简单)
  • 推荐:log/slog(Go 1.21+)
  • 高性能:zap、zerolog

示例(slog + systemd):

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("start", "port", 8080)

六、排查建议

  • 日志没出现?
    • 检查 systemctl status myapp
    • 确认是否输出到文件而不是 stdout
  • 权限问题?
    • /var/log/myapp 归属运行用户

如果你愿意,可以告诉我:

  • 你的 Golang 是用什么日志库?
  • 是裸机、Docker 还是 Kubernetes?
  • 想本地看还是集中收集?

我可以给你更具体的配置示例。

0 踩