温馨提示×

debian golang日志格式怎么定

小樊
40
2026-09-25 11:06:51
栏目: 编程语言

在 Debian 上运行 Go 程序时,“日志格式怎么定”主要取决于你要给谁看、给什么系统收集。下面按常见场景给你一套实用方案。


一、最基础:标准库 log(简单服务)

log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("server started")

默认格式:

2026/01/21 10:00:00 main.go:12: server started

✅ 优点:零依赖
❌ 缺点:格式不可控,不适合集中采集


二、推荐:结构化日志(JSON,最常用)

Debian + systemd + 日志采集(Loki / ELK)首选

使用 zap(uber 出品,性能最好)

logger, _ := zap.NewProduction()
defer logger.Sync()

logger.Info("http request",
    zap.String("method", "GET"),
    zap.Int("status", 200),
    zap.Duration("cost", 10*time.Millisecond),
)

输出示例:

{
  "level":"info",
  "ts":1705812000.123,
  "msg":"http request",
  "method":"GET",
  "status":200,
  "cost":0.01
}

✅ 适合:

  • journald
  • Loki / Prometheus
  • Filebeat / Vector

三、Debian + systemd 日志规范(很重要)

Debian 默认用 systemd-journald

建议:

  • 不要自己加时间戳(systemd 已有)
  • 一行一条日志
  • 用 JSON 或 key=value

✅ 推荐格式(systemd 友好):

{"level":"info","msg":"start","pid":1234}

或:

level=info msg=start pid=1234

四、生产环境推荐格式(总结)

1️⃣ 容器 / 云原生

{"time":"ISO8601","level":"info","msg":"...","trace_id":"..."}

2️⃣ 传统 Debian 服务

time=2026-01-21T10:00:00+08:00 level=info msg="server start"

3️⃣ 调试模式

[INFO] 2026-01-21 10:00:00 main.go:20 server start

五、systemd service 示例

[Unit]
Description=go service

[Service]
ExecStart=/opt/app/server
Restart=always
Environment=GIN_MODE=release

[Install]
WantedBy=multi-user.target

日志查看:

journalctl -u your-service -f

六、常见坑

❌ 多行日志(journald 会截断)
❌ 自己写文件又不轮转
✅ 用 logrotate 或 stdout + journald


七、快速选型建议

场景 推荐
小工具 log
API 服务 zap / slog
微服务 JSON + trace_id
Debian 系统服务 stdout + systemd

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

  • 是 systemd 服务 / Docker / K8s
  • 是否接 Loki / ELK
  • Go 版本(1.21+ 可用 log/slog)

我可以直接给你一套可复制的日志模板。

0 踩