温馨提示×

Debian Golang日志怎么采集

小樊
39
2026-08-11 21:19:49
栏目: 编程语言

在 Debian 上采集 Golang 应用的日志,常见做法主要有 应用层日志输出 + 系统层采集 两部分。下面按“最常用、最稳妥”的方式给你一个完整方案。


一、Golang 应用日志怎么打(推荐方式)

✅ 1. 使用标准库 log 或结构化日志库

推荐:

  • log/slog(Go 1.21+,官方结构化日志)
  • zap(Uber,高性能)
  • logrus(老牌,但已不活跃)

示例(slog,推荐)

package main

import (
    "log/slog"
    "os"
)

func main() {
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    logger.Info("server start", "port", 8080)
}

关键点:输出到 stdout / stderr


二、Debian 上日志采集方式(核心)

✅ 方案一:systemd + journald(最推荐 ✅)

如果你用 systemd 管理 Golang 服务,这是最标准的方式。

1️⃣ 编写 systemd 服务

# /etc/systemd/system/myapp.service
[Unit]
Description=Golang App
After=network.target

[Service]
ExecStart=/usr/local/bin/myapp
Restart=always
User=appuser
WorkingDirectory=/opt/myapp

# 日志自动进入 journald
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

2️⃣ 启动服务

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

3️⃣ 查看日志

journalctl -u myapp -f

优点

  • 自动采集 stdout/stderr
  • 日志带时间、PID、服务名
  • 无需额外配置

✅ 方案二:直接写文件 + filebeat / rsyslog(传统)

Golang 写文件

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

⚠️ 不推荐直接写文件,除非你有特殊需求。

采集方式

  • rsyslog
  • filebeat
  • fluentd

示例(rsyslog):

# /etc/rsyslog.d/myapp.conf
input(type="imfile" File="/var/log/myapp/app.log" Tag="myapp")

✅ 方案三:Docker / Kubernetes(云原生)

Docker

docker logs <container_id>

Kubernetes

kubectl logs pod-name

容器里一定要输出到 stdout/stderr


三、生产环境推荐组合 ✅

场景 推荐方案
Debian 物理机 / 虚拟机 systemd + journald
需要集中采集 journald → filebeat → ELK
容器 stdout + Docker / K8s
结构化日志 slog / zap(JSON)

四、常见坑(非常重要)

Golang 写文件 + 自己 rotate

  • 容易丢日志
  • 不如 journald 稳定

日志不输出时间戳

  • slog / zap 自带
  • journald 自带

日志量大不限制

  • journald 自动限制
  • 文件日志要配 logrotate

五、一个标准生产示例(总结)

Golang → stdout (JSON)
        ↓
systemd service
        ↓
journald
        ↓
filebeat → Elasticsearch / Loki

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

  • ✅ 是否用 systemd
  • ✅ 是否需要集中采集(ELK / Loki / Grafana)
  • ✅ 是否容器化

我可以直接给你 一套可复制的完整配置

0