温馨提示×

如何分割debian golang日志

小樊
51
2026-10-07 02:32:58
栏目: 编程语言

在 Debian 上“分割 Golang 日志”通常有几种场景,下面按最常见做法给你说明,你可以按需选择。


一、Golang 应用自身做日志分割(推荐)

1. 使用 lumberjack(最常用)

Golang 程序里直接集成日志轮转,不依赖系统。

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

func main() {
    log.SetOutput(&lumberjack.Logger{
        Filename:   "/var/log/myapp/app.log",
        MaxSize:    10,    // MB
        MaxBackups: 7,     // 保留旧文件数
        MaxAge:     30,    // 天
        Compress:   true,  // 压缩
    })

    log.Println("hello")
}

✅ 优点:跨平台、可控、Debian 无关
❌ 需要改代码


二、使用 Debian 自带的 logrotate(最省事)

如果你 Golang 程序只是写文件(如 /var/log/myapp.log):

1. 创建 logrotate 配置

sudo nano /etc/logrotate.d/myapp

示例:

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

⚠️ 关键参数

  • copytruncate:Golang 不重开文件时必须用
  • 否则需要程序支持 SIGHUP 重新打开日志

2. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp  # 模拟
sudo logrotate -f /etc/logrotate.d/myapp  # 强制执行

✅ 优点:不改代码
❌ 依赖外部调度


三、按“级别 / 模块”分割日志(代码层)

logInfo  := log.New(os.OpenFile("info.log", ...))
logError := log.New(os.OpenFile("error.log", ...))

或使用 zap / logrus:

  • zap:InfoLogger, ErrorLogger
  • logrus:Hook

四、使用 systemd + journald(Debian 10+)

如果是 systemd 服务:

[Service]
StandardOutput=journal
StandardError=journal

查看:

journalctl -u myapp.service

✅ 不用管文件
❌ 不是“文件分割”


五、常见坑(Debian + Golang)

问题 原因 解决
日志不轮转 没 copytruncate 加参数
磁盘爆满 没 MaxBackups 限制数量
权限错误 /var/log 无写权限 www-data / debian 用户

推荐方案总结

  • 新项目:lumberjack
  • 老项目不改代码:logrotate + copytruncate
  • 系统服务:journald

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

  • Golang 用的日志库(log / zap / logrus)
  • 是否 systemd 启动
  • 日志路径

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

0 踩