github.com/uber-go/zap, zap 是目前我比較常用的 logger package

在寫 log file 時,通常需要定期的封存檔案,避免單一檔案過大而導致之後難以整理

zap 本身沒有 rotation 功能,要自己寫,或是用 lumberjack 這個 package

zap 官方的 FAQ 中 zap/FAQ.md

就有一個基本的 example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
w := zapcore.AddSync(&lumberjack.Logger{
    Filename:   "/var/log/myapp/foo.log",
    MaxSize:    500, // megabytes
    MaxBackups: 3,
    MaxAge:     28, // days
})
core := zapcore.NewCore(
    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
    w,
    zap.InfoLevel,
)
logger := zap.New(core)

如果要設定成把 log message 同時寫到檔案跟畫面的話,則要使用使用 zapcore.NewMultiWriteSyncer(…)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
writeFile := zapcore.AddSync(&lumberjack.Logger{
    Filename: "service.log",
    MaxSize:  10, // megabytes
    MaxAge:   28, // days
})
writeStdout := zapcore.AddSync(os.Stdout)

core := zapcore.NewCore(
  zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
  zapcore.NewMultiWriteSyncer(writeFile, writeStdout),
  zap.InfoLevel,
)

logger := zap.New(core)

上面設定的 logger 會缺少 caller 跟 stack trace 的資訊,需要再加入 options

1
2
3
4
5
logger := zap.New(
    core,
    zap.AddCaller(),
    zap.AddStacktrace(zap.ErrorLevel),
)