温馨提示×

怎样采集linux golang日志

小樊
47
2026-09-05 15:18:15
栏目: 编程语言

在 Linux 下采集 Golang 程序日志,常见做法可分为 日志产生方式 和 日志采集方式 两部分。下面从实际工程角度给你一个系统性说明。


一、Golang 日志如何产生

1. 使用标准库(基础)

import "log"

log.Println("this is a log")

缺点:功能弱,不适合生产环境。


2. 使用主流日志库(推荐)

(1)logrus

import "github.com/sirupsen/logrus"

log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.Info("service started")

(2)zap(高性能,推荐)

import "go.uber.org/zap"

logger, _ := zap.NewProduction()
logger.Info("hello zap")

✅ 生产建议:

  • 输出 JSON 格式
  • 输出到 stdout / stderr
  • 不自己写文件轮转

二、Linux 下日志采集方式(重点)

✅ 方案 1:直接输出到 stdout(最推荐)

Golang 程序只打印日志,不管理文件

logger.Info("user login")

由 Linux 环境采集:

  • systemd
  • Docker
  • Kubernetes

✅ 方案 2:systemd + journald(物理机 / 虚拟机)

1. 编写 systemd 服务

[Unit]
Description=go-service

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

[Install]
WantedBy=multi-user.target

2. 查看日志

journalctl -u go-service -f

✅ 优点:

  • 自动轮转
  • 自动采集
  • 不需要 Go 管日志

✅ 方案 3:Docker + 日志驱动

docker run \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  my-go-app

查看:

docker logs -f container_id

Docker 默认会采集 stdout。


✅ 方案 4:Filebeat / Vector 采集日志文件(传统方式)

如果 Golang 写文件:

log.SetOutput(os.OpenFile("/var/log/app.log", ...))

Filebeat 配置示例

filebeat.inputs:
- type: log
  paths:
    - /var/log/app.log

output.elasticsearch:
  hosts: ["localhost:9200"]

⚠️ 不推荐新项目使用(复杂、易丢日志)


✅ 方案 5:Kubernetes(云原生标准)

Go 程序:

  • 输出 JSON 到 stdout

K8s:

  • 自动落盘
  • 可用:
    • Loki
    • ELK
    • OpenTelemetry
kubectl logs pod-name -f

三、推荐的日志规范(很重要)

✅ 日志内容建议:

{
  "time": "2026-01-15T10:00:00Z",
  "level": "info",
  "service": "user-service",
  "msg": "user login",
  "trace_id": "abc123"
}

✅ 不推荐:

  • 自己写 log rotate
  • 日志写多个文件
  • 不同级别分开文件

四、总结(直接选)

场景 推荐方案
物理机 systemd + journald
Docker stdout + docker log
K8s stdout + Loki
老系统 Filebeat + 文件

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

  • 是否用 Docker / K8s
  • 是否已有 ELK / Loki
  • Go 程序是 新项目还是老项目

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

0 踩