温馨提示×

golang日志在debian如何轮转

小樊
39
2026-09-22 09:54:32
栏目: 编程语言

在 Debian 上让 Golang 程序日志轮转,常见做法有几种,下面按「推荐程度」给你梳理。


一、推荐方式:用 Linux 自带的 logrotate(最常用)

思路
Golang 程序只管往固定文件写日志(例如 /var/log/myapp.log),轮转交给 Debian 的 logrotate

1. 示例 Golang 代码(写文件)

package main

import (
	"log"
	"os"
)

func main() {
	f, _ := os.OpenFile("/var/log/myapp.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	defer f.Close()

	log.SetOutput(f)

	for {
		log.Println("hello log")
	}
}

2. 配置 logrotate

创建配置文件:

sudo nano /etc/logrotate.d/myapp

内容示例:

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

3. 关键参数说明

  • copytruncate非常重要
    • 不重启 Go 程序
    • 复制日志后清空原文件
  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志

4. 手动测试

sudo logrotate -f /etc/logrotate.d/myapp

优点

  • 不用改 Go 代码逻辑
  • 稳定、标准、运维友好

二、Go 程序内部轮转(不依赖系统)

适合 容器 / 无 logrotate 环境

常用库

  • lumberjack
  • go-file-rotatelogs

示例(lumberjack)

import (
	"log"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	log.SetOutput(&lumberjack.Logger{
		Filename:   "/var/log/myapp.log",
		MaxSize:    10, // MB
		MaxBackups: 7,
		MaxAge:     7,  // days
		Compress:   true,
	})

	log.Println("hello")
}

✅ 优点

  • 自包含
  • 适合 Docker / K8s

❌ 缺点

  • 多实例写同一文件不安全

三、systemd 方式(journald)

如果你用 systemd 启动 Go 程序:

[Service]
StandardOutput=journal
StandardError=journal

查看日志:

journalctl -u myapp

⚠️ 不生成文件,不适合需要落盘审计的场景


四、Docker / K8s 场景

  • 不自己轮转
  • 交给:
    • Docker log driver
    • K8s log agent(filebeat / fluentd)

总结建议

场景 推荐方案
Debian 物理机 / 虚拟机 ✅ logrotate
Docker 单容器 lumberjack
K8s 集中日志系统
systemd 服务 journald

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

  • 是否是 systemd 服务
  • 是否 Docker
  • 日志量级(MB/GB)

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

0