3 回答

TA貢獻1851條經驗 獲得超3個贊
我在https://github.com/natefinch/lumberjack 上取得了很好的成功,它是輕量級的,搭載在 golang 的標準和內存高效的“日志”pkg 上。
使用非常簡單,只需添加一行代碼即可設置,并正常使用日志:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
})

TA貢獻1804條經驗 獲得超2個贊
這是一個內部解決方案。您可以考慮讓一個 goroutine 負責日志記錄和日志輪換,并通過一個通道接收來自其他 goroutine 的日志。每當需要輪轉時,goroutine 都會輪轉日志,而來自其他 goroutine 的傳入日志則在通道上排隊。日志輪換完成后,它將使通道上的任何內容出列并繼續記錄。
類似的東西:
type Log struct {
log string
// other info you might want
}
// This will be your goroutine
func Logging(LogChannel chan Log) {
// assume logger creates/opens a file and prepares it for writing
logger := New(logger)
for {
// collect a log. Will also block until a log is available on the channel
log <- LogChannel
if timeToRotate() {
RotateLogFile(logger)
}
// write log
logger.Log(log)
}
}
編輯:在檢查日志文件是否旋轉后,先前的代碼具有阻塞調用。最好把它放在timeToRotate函數調用之前,以防止在日志文件輪換后寫日志的可能性
- 3 回答
- 0 關注
- 730 瀏覽
添加回答
舉報