温馨提示×

centos golang日志怎么切割

小樊
40
2026-09-21 09:41:47
栏目: 编程语言

在 CentOS 上,Golang 日志切割常见有 三种方式:
1️⃣ 程序内切割(Go 代码)
2️⃣ 使用 Linux 自带的 logrotate
3️⃣ 使用第三方日志库自动切割

下面分别说明,并给出推荐方案。


一、使用 logrotate(最推荐,简单稳定)

适合:所有 Go 程序(不管用什么日志库)

1. 安装(一般 CentOS 自带)

which logrotate

2. 示例:切割 /var/log/myapp/*.log

新建配置:

sudo vi /etc/logrotate.d/myapp

内容示例:

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

参数说明

  • daily:每天切割
  • rotate 30:保留 30 份
  • compress:压缩旧日志
  • copytruncate:不重启 Go 程序就能切割(很重要)
  • dateext:日志加日期后缀

3. 手动测试

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

✅ Go 程序无需感知日志切割


二、Go 程序内切割(lumberjack)

适合:不想依赖系统工具

使用 lumberjack

go get gopkg.in/natefinch/lumberjack.v2

示例代码

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

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

    log.Println("hello")
}

✅ 自动按大小切割
❌ 按时间切割不太灵活


三、使用日志库自带功能

常用库

  • zap + lumberjack(非常推荐)
  • logrus + rotatelogs

zap 示例

writer := zapcore.AddSync(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    100,
    MaxBackups: 30,
    MaxAge:     30,
})

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

logger := zap.New(core)

四、CentOS + systemd 注意事项

如果你用 systemd 启动 Go 程序:

[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=append:/var/log/myapp/app.log

⚠️ 不要用 StandardOutput=syslog 再自己切


五、推荐方案总结

场景 推荐方式
生产环境 ✅ logrotate
容器 / K8s 程序内 lumberjack
简单脚本 logrotate
高性能日志 zap + lumberjack

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

  • 用的 什么日志库(log / zap / logrus)
  • 是否 systemd 启动
  • 想按 时间还是大小 切割

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

0 踩