温馨提示×

debian golang日志如何采集

小樊
43
2026-09-28 08:45:51
栏目: 编程语言

在 Debian 上采集 Golang 应用日志,常见做法可分为 日志产生方式、采集方案 和 集中化处理 三层。下面按实战角度说明。


一、Golang 日志怎么写(先规范)

1. 使用标准库或主流日志库

  • 标准库:log
  • 推荐:
    • zap(Uber,性能高)
    • logrus
    • slog(Go 1.21+ 官方结构化日志)

示例(zap):

logger, _ := zap.NewProduction()
logger.Info("server start", zap.String("host", "0.0.0.0"))

2. 日志输出位置(关键)

两种主流方式:

  • 输出到 文件
  • 输出到 stdout / stderr(推荐容器或 systemd 环境)

✅ 建议:
生产环境输出到 stdout,由系统统一采集


二、Debian 系统级日志采集方式

方案 1:systemd + journald(最常用)

如果你用 systemd 管理 Golang 服务:

1. 编写 service

[Unit]
Description=golang app

[Service]
ExecStart=/opt/app/app
Restart=always
User=appuser

[Install]
WantedBy=multi-user.target

2. 查看日志

journalctl -u yourapp.service -f

3. 采集 journal 日志

  • 用 journalbeat
  • 或用 rsyslog 转发

方案 2:日志文件 + Filebeat(最通用)

适合非 systemd 或传统部署

1. Golang 写文件

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

2. 安装 Filebeat

apt install filebeat

3. 配置

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

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

方案 3:rsyslog 转发(轻量)

适合不想装额外 agent

*.* @logserver:514

Golang 日志通过 syslog 输出:

log.SetOutput(syslog.New(syslog.LOG_INFO, "app"))

三、容器 / K8s 场景(Debian 主机)

  • Golang 输出 stdout
  • Docker / containerd 自动收集
  • 用:
    • Loki + Promtail
    • ELK / EFK

四、推荐组合(生产实践)

场景 推荐方案
裸机 Debian systemd + journald + Filebeat
多服务 文件日志 + Filebeat
容器 stdout + Loki
审计需求 rsyslog

五、常见坑

  • 日志不轮转 → 用 logrotate
  • 时区不一致 → 设置 TZ
  • 大量日志 → 用结构化日志(JSON)

如果你能说明:

  • 是否用 systemd
  • 是否容器
  • 日志要去哪(ES / Loki / 本地)

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

0 踩