温馨提示×

centos golang日志怎么切

小樊
46
2026-10-06 01:34:27
栏目: 编程语言

在 CentOS 上运行 Golang 程序时,“日志切分”一般有 三种常见做法,你可以根据场景选一种:


一、用系统自带的 logrotate(最推荐,简单稳定)

适合: 程序直接把日志写到文件(如 app.log)

1. 示例 Golang 代码

package main

import (
    "log"
    "os"
)

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

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

2. 配置 logrotate

新建文件:

/etc/logrotate.d/myapp

内容示例:

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

3. 说明

  • copytruncate:不重启程序就能切日志(Golang 最常用)
  • 测试:
logrotate -d /etc/logrotate.d/myapp

✅ 优点:不用改代码,稳定
❌ 缺点:依赖外部工具


二、Golang 程序内部切日志(推荐用第三方库)

适合: 不想依赖系统工具

常用库

  • github.com/lestrrat-go/file-rotatelogs
  • gopkg.in/natefinch/lumberjack.v2

示例(lumberjack)

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:     7, // days
        Compress:   true,
    })

    log.Println("hello")
}

✅ 优点:跨平台、可控
❌ 缺点:需要引入依赖


三、systemd + stdout(现代方式)

适合: 用 systemd 管理 Golang 服务

1. Golang 直接打 stdout

log.Println("hello")

2. systemd 配置

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

3. 日志查看

journalctl -u myapp -f

✅ 日志自动由 journald 管理
❌ 不适合需要单独日志文件的场景


推荐方案总结

场景 推荐
CentOS 服务器 logrotate
容器 / 跨平台 lumberjack
systemd 服务 stdout + journald

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

  • 你是 systemd / nohup / docker 启动的?
  • 日志是 stdout 还是文件?

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

0 踩