温馨提示×

debian中golang日志如何配

小樊
41
2026-10-01 06:43:10
栏目: 编程语言

在 Debian 系统上配置 Go(Golang)日志,通常分为应用内日志配置和**系统级日志管理(journald / rsyslog / logrotate)**两部分。下面按常见场景说明。


一、Go 应用内日志配置(代码层)

1. 使用标准库 log

package main

import (
    "log"
    "os"
)

func main() {
    file, err := os.OpenFile("/var/log/myapp/app.log",
        os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

    log.Println("server started")
}

⚠️ 注意:

  • /var/log/myapp 需要存在且应用有写权限
  • Debian 上一般属主为 www-data 或专用用户

2. 使用 log/slog(Go 1.21+ 推荐)

package main

import (
    "log/slog"
    "os"
)

func main() {
    logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    slog.SetDefault(logger)

    logger.Info("starting service", "port", 8080)
}

生产建议输出到 stdout(由 systemd 接管):

slog.New(slog.NewJSONHandler(os.Stdout, nil))

3. 第三方日志库(常用)

  • zap(Uber)
  • logrus
  • zerolog

示例(zap):

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

二、Debian 系统级日志配置(运行层)

方式一:systemd + journald(推荐 ✅)

1. 创建 systemd 服务

/etc/systemd/system/myapp.service

[Unit]
Description=My Go App
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
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

✅ 优点:

  • 自动轮转
  • 无需自己管理日志文件
  • 安全、标准

方式二:写文件 + logrotate

1. 应用写日志到文件

/var/log/myapp/app.log

2. 配置 logrotate

/etc/logrotate.d/myapp

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

⚠️ copytruncate 对 Go 程序较安全


方式三:rsyslog(传统方式)

适合需要统一收集日志的场景,一般不推荐新项目使用。


三、权限与目录建议

sudo mkdir -p /var/log/myapp
sudo chown myapp:myapp /var/log/myapp

四、生产环境最佳实践 ✅

✔ 使用 systemd + stdout + JSON 日志
✔ 不要在代码里手写日志轮转
✔ 日志级别可控(debug / info / warn / error)
✔ 敏感信息不要进日志


如果你愿意,我可以:

  • 给你一个 完整 systemd + Go 模板
  • 帮你选 zap / slog 配置方案
  • 针对 Docker / Kubernetes 场景说明

你现在是 裸机 Debian 还是 容器环境?

0 踩