uber zap log组建,利用lumberjack插件写到文件
package log
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
"sync"
"time"
)
var Logger *zap.Logger
func Release() error {
return Logger.Sync()
}
type logWriter struct {
w *lumberjack.Logger
t time.Time
mu sync.Mutex
}
func (lw *logWriter) Write(p []byte) (n int, err error) {
lw.mu.Lock()
defer lw.mu.Unlock()
now := time.Now()
if now.YearDay() != lw.t.YearDay() {
lw.t = now
if err := lw.w.Rotate(); nil != err {
return 0, err
}
}
return lw.w.Write(p)
}
func Init(serviceName string, isDebug bool, logFilePath string, logLevel string, maxByteSize int, maxAge int, needCompress bool, customFields ...zap.Field) {
var w zapcore.WriteSyncer
if isDebug {
w = zapcore.AddSync(os.Stdout)
} else {
w = zapcore.AddSync(&logWriter{
w: &lumberjack.Logger{
Filename: logFilePath,
MaxSize: maxByteSize,
MaxAge: maxAge,
Compress: needCompress,
},
t: time.Now(),
})
}
atomicLevel := zap.NewAtomicLevel()
var level zapcore.Level
if err := level.Set(logLevel); nil != err {
panic(err)
}
atomicLevel.SetLevel(level)
var encoderConfig zapcore.EncoderConfig
if isDebug {
encoderConfig = zap.NewDevelopmentEncoderConfig()
} else {
encoderConfig = zap.NewProductionEncoderConfig()
}
encoderConfig.MessageKey = "message"
encoderConfig.LevelKey = "level"
encoderConfig.TimeKey = "time"
encoderConfig.NameKey = "name"
encoderConfig.CallerKey = "caller"
encoderConfig.StacktraceKey = "stacktrace"
encoderConfig.EncodeTime = zapcore.RFC3339NanoTimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
w,
level,
)
fields := append(customFields, zap.String("service", serviceName))
Logger = zap.New(core, zap.Fields(fields...))
}