zap 和 lumberjack 联合应用
本篇内容次要是联合这两个开源库应用。
package loggerimport ( "os" "sync" "time" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore")var Log *ZapLoggertype ZapLogger struct { *zap.SugaredLogger logLevel zap.AtomicLevel}const defaultloglevel = zapcore.DebugLevel // 默认日志等级为debug//设置日志// Param:// logPath 日志文件门路// logLevel 日志级别 debug/info/warn/error// maxSize 单个文件大小,MB// maxBackups 保留的文件个数// compress 压缩// jsonFormat 是否输入为json格局// shoowLine 显示代码行// logInConsole 是否同时输入到控制台func (l *ZapLogger) SetLogger(logLevel, logPath string, maxSizeMb, maxBackups int, jsonFormat, logInConsole bool) { hook := lumberjack.Logger{ Filename: logPath, // 日志文件门路 MaxSize: maxSizeMb, // megabytes MaxBackups: maxBackups, // 最多保留300个备份 Compress: false, // 是否压缩 disabled by default } var syncer zapcore.WriteSyncer if !logInConsole && "" != logPath { syncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(&hook)) } else { syncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)) } formatEncodeTime := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05.000")) } encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "line", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, EncodeTime: formatEncodeTime, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, EncodeName: zapcore.FullNameEncoder, } var encoder zapcore.Encoder if jsonFormat { encoder = zapcore.NewJSONEncoder(encoderConfig) } else { encoder = zapcore.NewConsoleEncoder(encoderConfig) } // debug->info->warn->error var level zapcore.Level if level.UnmarshalText([]byte(logLevel)) != nil { level = defaultloglevel } atomicLevel := zap.NewAtomicLevelAt(level) core := zapcore.NewCore( encoder, syncer, atomicLevel, ) logger := zap.New(core) logger = logger.WithOptions(zap.AddCaller()) //增加代码行号 l.SugaredLogger = logger.Sugar() l.logLevel = atomicLevel}var loggers sync.Mapfunc GetLogger(name string) *ZapLogger { val, ok := loggers.Load(name) if ok { log, ok := val.(*ZapLogger) if !ok { return nil } return log } log := &ZapLogger{} if "" != name { log.SetLogger( "DEBUG", "test_"+name+".log", 40, 100, false, false, ) } else { //输入到控制台 log.SetLogger( "DEBUG", "", 40, 100, false, true, ) } loggers.Store(name, log) return log}