溫馨提示×

CentOS環境下Golang日志如何分割

小樊
34
2025-08-02 15:10:41
欄目: 編程語言

在CentOS環境下,使用Golang進行日志分割可以通過以下幾種方法實現:

方法一:使用第三方庫

  1. 安裝第三方日志庫: 你可以使用logruszap等第三方日志庫,它們提供了日志分割的功能。

    go get github.com/sirupsen/logrus
    
  2. 配置日志分割: 使用logrus時,可以通過設置logrus.SetReportCaller(true)來記錄調用者信息,并通過自定義io.Writer來實現日志分割。

    package main
    
    import (
        "os"
        "time"
        "github.com/sirupsen/logrus"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    
    func main() {
        log := logrus.New()
        log.SetReportCaller(true)
        log.SetFormatter(&logrus.JSONFormatter{})
    
        // 設置日志分割
        log.SetOutput(&lumberjack.Logger{
            Filename:   "/var/log/myapp.log",
            MaxSize:    10, // 每個日志文件最大10MB
            MaxBackups: 3,  // 最多保留3個備份
            MaxAge:     28, // 最多保留28天
            Compress:   true, // 是否壓縮備份日志
        })
    
        log.Info("This is an info message")
    }
    

方法二:使用系統工具

  1. 使用logrotatelogrotate是Linux系統中用于管理日志文件的工具,可以自動分割、壓縮和刪除舊日志文件。

    • 創建一個logrotate配置文件:

      sudo nano /etc/logrotate.d/myapp
      
    • 添加以下內容:

      /var/log/myapp.log {
          daily
          rotate 7
          compress
          delaycompress
          missingok
          notifempty
          create 640 root root
      }
      
    • 這個配置表示每天分割一次日志文件,保留最近7天的日志,并對舊日志進行壓縮。

  2. 重啟logrotate服務: 確保logrotate服務已啟用并重啟:

    sudo systemctl restart logrotate
    

方法三:自定義日志分割邏輯

如果你需要更復雜的日志分割邏輯,可以在Golang代碼中實現自定義的日志分割功能。

package main

import (
    "io"
    "log"
    "os"
    "time"
)

type RotatingWriter struct {
    file        *os.File
    maxFileSize int64
    backupCount int
    currentSize int64
    lastRotate  time.Time
}

func NewRotatingWriter(filename string, maxFileSize int64, backupCount int) (*RotatingWriter, error) {
    file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        return nil, err
    }
    return &RotatingWriter{
        file:        file,
        maxFileSize: maxFileSize,
        backupCount: backupCount,
        lastRotate:  time.Now(),
    }, nil
}

func (rw *RotatingWriter) Write(p []byte) (n int, err error) {
    n, err = rw.file.Write(p)
    rw.currentSize += int64(n)

    if rw.currentSize >= rw.maxFileSize {
        rw.rotate()
    }

    return n, err
}

func (rw *RotatingWriter) rotate() error {
    if err := rw.file.Close(); err != nil {
        return err
    }

    // 重命名當前日志文件
    newFilename := rw.file.Name() + "." + time.Now().Format("2006-01-02-15-04-05")
    if err := os.Rename(rw.file.Name(), newFilename); err != nil {
        return err
    }

    // 創建新的日志文件
    rw.file, err = os.OpenFile(rw.file.Name(), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        return err
    }

    rw.lastRotate = time.Now()
    return nil
}

func main() {
    log.SetOutput(&RotatingWriter{
        filename:    "/var/log/myapp.log",
        maxFileSize: 10 * 1024 * 1024, // 10MB
        backupCount: 3,
    })

    log.Info("This is an info message")
}

這個示例代碼實現了一個簡單的日志分割功能,當日志文件大小達到指定值時,會自動創建一個新的日志文件,并保留指定數量的舊日志文件。

選擇適合你項目需求的方法來實現日志分割。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女