温馨提示×

debian golang日志怎么归档

小樊
32
2026-10-12 23:08:42
栏目: 编程语言

在 Debian 上用 Golang 写服务时,“日志归档”一般分两层来做:

  1. Golang 程序里:控制日志输出方式(文件 / 格式 / 切割)
  2. Debian 系统层:用 logrotate 或 systemd 做定期归档、压缩、清理

下面给你几种常见、实用的方案。


一、Golang 程序内做日志切割(推荐组合)

方案 1:lumberjack(最常用)

Golang 生态里最经典的日志滚动库。

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

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

    log.Println("hello")
}

特点:

  • 自动按大小切割
  • 自动压缩(gz)
  • 自动清理旧日志
  • 不需要 logrotate

方案 2:使用 zap + lumberjack(生产推荐)

import (
    "go.uber.org/zap"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    w := zapcore.AddSync(&lumberjack.Logger{
        Filename:   "/var/log/myapp/app.log",
        MaxSize:    100,
        MaxBackups: 10,
        MaxAge:     30,
        Compress:   true,
    })

    core := zapcore.NewCore(
        zapcore.JSONEncoder(zap.NewProductionEncoderConfig()),
        w,
        zap.InfoLevel,
    )

    logger := zap.New(core)
    logger.Info("start service")
}

二、Debian 系统层归档(logrotate)

如果你的 Golang 程序直接输出到文件(不自己切):

1. 安装 logrotate(一般默认有)

sudo apt install logrotate

2. 新建配置

sudo vim /etc/logrotate.d/myapp

示例:

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

说明:

  • copytruncate:不重启程序,直接截断日志(适合不支持信号的服务)
  • compress:gzip 归档
  • rotate 30:保留 30 天

3. 测试

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

三、systemd 服务 + journald(无文件日志)

如果你用 systemd 启动 Golang:

[Service]
ExecStart=/opt/myapp/myapp
StandardOutput=journal
StandardError=journal

查看日志:

journalctl -u myapp

归档由 systemd 自动管理:

sudo journalctl --vacuum-time=30d

四、推荐实践(总结)

场景 推荐方案
普通 Go 服务 zap + lumberjack
传统运维 输出文件 + logrotate
systemd 服务 journald
容器环境 stdout + 外部采集

如果你是具体场景(比如 systemd / Docker / K8s / 多实例),我可以给你更精确的配置。

0 踩