在CentOS系統中,Golang日志輪轉可以通過使用第三方庫或者自定義日志處理程序來實現。這里我們將介紹兩種方法:使用第三方庫lumberjack
和使用Golang內置的log
包。
方法一:使用第三方庫lumberjack
lumberjack
庫。在終端中運行以下命令:go get github.com/natefinch/lumberjack
lumberjack
庫,并創建一個lumberjack.Logger
實例:package main
import (
"github.com/natefinch/lumberjack"
"log"
)
func main() {
logger := &lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志文件路徑
MaxSize: 10, // 每個日志文件的最大尺寸(單位:MB)
MaxBackups: 3, // 保留的最大日志文件數量
MaxAge: 28, // 保留的最大日志文件天數
Compress: true, // 是否壓縮舊的日志文件
}
defer logger.Close()
log.SetOutput(logger)
// 使用log輸出日志
log.Println("This is a log message.")
}
方法二:使用Golang內置的log
包
io.Writer
接口:package main
import (
"io"
"log"
"os"
"time"
)
type RotatingFile struct {
filename string
maxSize int64
maxBackups int
maxAge int
compress bool
currentSize int64
}
func NewRotatingFile(filename string, maxSize int64, maxBackups int, maxAge int, compress bool) *RotatingFile {
return &RotatingFile{
filename: filename,
maxSize: maxSize,
maxBackups: maxBackups,
maxAge: maxAge,
compress: compress,
currentSize: 0,
}
}
func (rf *RotatingFile) Write(p []byte) (n int, err error) {
n, err = rf.file.Write(p)
rf.currentSize += int64(n)
if rf.currentSize >= rf.maxSize {
rf.rotate()
}
return n, err
}
func (rf *RotatingFile) rotate() {
rf.file.Close()
for i := rf.maxBackups - 1; i > 0; i-- {
src := rf.filename + "." + strconv.Itoa(i)
dst := rf.filename + "." + strconv.Itoa(i+1)
os.Rename(src, dst)
}
if rf.compress {
src := rf.filename + ".1"
dst := rf.filename + ".1.gz"
gzipFile, err := os.Open(src)
if err != nil {
log.Println("Error opening gzip file:", err)
return
}
defer gzipFile.Close()
gzipWriter := gzip.NewWriter(os.Stdout)
defer gzipWriter.Close()
io.Copy(gzipWriter, gzipFile)
}
os.Rename(rf.filename, rf.filename+".1")
if _, err := os.Stat(rf.filename); os.IsNotExist(err) {
os.OpenFile(rf.filename, os.O_CREATE|os.O_WRONLY, 0644)
}
}
func (rf *RotatingFile) Close() error {
return rf.file.Close()
}
package main
import (
"log"
"os"
"time"
)
func main() {
logFile := NewRotatingFile("/var/log/myapp.log", 10, 3, 28, true)
defer logFile.Close()
log.SetOutput(logFile)
// 使用log輸出日志
log.Println("This is a log message.")
}
這兩種方法都可以實現Golang日志輪轉。你可以根據自己的需求選擇合適的方法。