温馨提示×

golang在debian怎么打日志

小樊
46
2026-10-21 17:43:22
栏目: 编程语言

在 Debian 上用 Go(Golang)打日志,通常分三层来看:

  1. Go 程序内部怎么写日志
  2. 日志写到哪里(文件 / systemd / stdout)
  3. Debian 上怎么查看和管理日志

下面按常见场景讲。


一、Go 程序里怎么打日志

1️⃣ 标准库(最简单)

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(log.LstdFlags | log.Lshortfile)

    log.Println("hello debian")
}

常用 flag:

  • log.Ldate
  • log.Ltime
  • log.Lmicroseconds
  • log.Lshortfile

2️⃣ 写日志到文件

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

⚠️ Debian 上:

  • /var/log 需要 root 权限
  • 推荐用专门目录:/var/log/myapp/

3️⃣ 使用成熟日志库(推荐)

logrus

import "github.com/sirupsen/logrus"

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

zap(高性能)

import "go.uber.org/zap"

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

二、Debian 上日志“放哪”

✅ 推荐方式:交给 systemd(最规范)

Debian 10+ 默认用 systemd + journald

1️⃣ Go 程序只输出到 stdout / stderr

log.Println("started")

2️⃣ 写 systemd service

/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

3️⃣ 启动

systemctl daemon-reload
systemctl enable myapp
systemctl start myapp

✅ 查看日志

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

✅ 优点:

  • 自动轮转
  • 权限安全
  • 不自己管文件

三、如果你一定要写日志文件

推荐目录

/var/log/myapp/

日志轮转(Debian 标准)

用 logrotate:

/etc/logrotate.d/myapp

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

四、生产环境最佳实践(总结)

✅ 推荐组合

  • Go:zap / logrus
  • 输出:stdout
  • 管理:systemd + journald
  • 需要文件:再接 logrotate

❌ 不推荐

  • Go 自己管理日志轮转
  • 直接写 /var/log 根目录
  • 用 root 跑业务程序

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

  • 是 命令行工具 / Web 服务 / 守护进程
  • 是否用 systemd
  • 是否需要 JSON 日志 / 审计日志

我可以给你一套可直接用的模板。

0 踩