温馨提示×

怎样用debian管golang日志

小樊
42
2026-09-28 08:57:53
栏目: 编程语言

在 Debian 上“管 Golang 日志”一般分三层:
1) 程序里怎么写日志(Go 侧)
2) 系统层面怎么收集/轮转(Debian 侧)
3) 日常怎么查看和运维

下面给你一套常用且稳妥的方案,从简单到规范。


一、Go 程序里怎么写日志(推荐做法)

1. 直接用标准库(最简单)

log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)

然后让 Debian 去接管 stdout(见第二节)。

2. 写文件(不推荐裸写)

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

⚠ 问题:文件不会自动轮转,要配合 logrotate。

3. 推荐:用成熟日志库

  • log/slog(Go 1.21+,官方)
  • zap
  • logrus

示例(slog + 文件):

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
logger.Info("start server")

✅ 最佳实践:Go 只输出到 stdout/stderr,日志管理交给 Debian


二、Debian 上管日志(核心)

方案 A:systemd + journald(最推荐)

1. 写 systemd 服务

/etc/systemd/system/myapp.service

[Unit]
Description=My Go App

[Service]
ExecStart=/opt/myapp/myapp
User=myapp
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

2. 启动

systemctl daemon-reload
systemctl enable --now myapp

3. 查看日志

journalctl -u myapp
journalctl -u myapp -f      # 实时
journalctl -u myapp --since "1 hour ago"

✅ 优点:

  • 自动轮转
  • 不需要 logrotate
  • 权限安全

方案 B:写文件 + logrotate(传统)

1. 日志路径

/var/log/myapp/app.log

2. logrotate 配置

/etc/logrotate.d/myapp

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

⚠ copytruncate 对 Go 程序友好(不重启也能轮转)


三、集中查看 & 排错

实时看

journalctl -u myapp -f

看错误

journalctl -u myapp -p err

磁盘占用

journalctl --disk-usage

清理

journalctl --vacuum-size=100M

四、生产环境推荐组合 ✅

项目 推荐
Go 日志 slog → stdout
进程管理 systemd
日志系统 journald
高级需求 接 rsyslog / loki / ELK

五、如果你愿意,我可以:

  • 给你一个完整 Go + systemd 示例
  • 教你 Docker + Debian 日志方案
  • 帮你配 Loki / Grafana
  • 针对 高并发日志性能做优化

你现在是开发环境还是服务器生产环境?

0 踩