在CentOS環境下,使用Golang進行日志分割可以通過以下幾種方法實現:
安裝第三方日志庫:
你可以使用logrus
或zap
等第三方日志庫,它們提供了日志分割的功能。
go get github.com/sirupsen/logrus
配置日志分割:
使用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")
}
使用logrotate
:
logrotate
是Linux系統中用于管理日志文件的工具,可以自動分割、壓縮和刪除舊日志文件。
創建一個logrotate
配置文件:
sudo nano /etc/logrotate.d/myapp
添加以下內容:
/var/log/myapp.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root root
}
這個配置表示每天分割一次日志文件,保留最近7天的日志,并對舊日志進行壓縮。
重啟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")
}
這個示例代碼實現了一個簡單的日志分割功能,當日志文件大小達到指定值時,會自動創建一個新的日志文件,并保留指定數量的舊日志文件。
選擇適合你項目需求的方法來實現日志分割。