golang uber log插件支持寫到文件

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...))
}

 

發佈了52 篇原創文章 · 獲贊 4 · 訪問量 9338
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章