package utils import ( "os" "time" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) var Logger *zap.SugaredLogger func InitLog() { // 设置控制台编码器(带颜色) consoleEncoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{ MessageKey: "msg", LevelKey: "level", EncodeLevel: zapcore.LowercaseColorLevelEncoder, //设置颜色 TimeKey: "ts", EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05")) }, CallerKey: "file", EncodeCaller: zapcore.ShortCallerEncoder, EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) { enc.AppendInt64(int64(d) / 1000000) }, }) // 设置文件编码器(无颜色) fileEncoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{ MessageKey: "msg", LevelKey: "level", EncodeLevel: zapcore.LowercaseLevelEncoder, // 无颜色 TimeKey: "ts", EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05")) }, CallerKey: "file", EncodeCaller: zapcore.ShortCallerEncoder, EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) { enc.AppendInt64(int64(d) / 1000000) }, }) // 实现日志等级的interface infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl == zapcore.InfoLevel }) errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl == zapcore.ErrorLevel }) fatalLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl == zapcore.FatalLevel }) // 获取日志文件的io.Writer 抽象 path := GetConfigString("log.path") infoFile := GetConfigString("log.infoFile") errorFile := GetConfigString("log.errorFile") fatalFile := GetConfigString("log.fatalFile") // 生成带日期的文件名 today := time.Now().Format("2006-01-02") infoWriter := getWriter(path + "/" + today + "-" + infoFile) errorWriter := getWriter(path + "/" + today + "-" + errorFile) fatalWriter := getWriter(path + "/" + today + "-" + fatalFile) // 创建核心 core := zapcore.NewTee( zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.InfoLevel })), // 控制台打印所有级别,带颜色 zapcore.NewCore(fileEncoder, infoWriter, infoLevel), // info 只写入 info 文件 zapcore.NewCore(fileEncoder, errorWriter, errorLevel), // error 只写入 error 文件 zapcore.NewCore(fileEncoder, fatalWriter, fatalLevel), // fatal 只写入 fatal 文件 ) log := zap.New(core, zap.AddCaller()) // 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数 Logger = log.Sugar() } func getWriter(filename string) zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: filename, MaxSize: GetConfigInt("log.maxSize"), MaxBackups: GetConfigInt("log.maxBackups"), MaxAge: GetConfigInt("log.maxAge"), Compress: false, LocalTime: true, } return zapcore.AddSync(lumberJackLogger) }