package logger import ( "fmt" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" "os" "path/filepath" "time" ) // 全局日志实例 var Logger *zap.Logger var SugarLogger *zap.SugaredLogger // InitLogger 初始化日志配置 func InitLogger() error { // 创建核心日志写入器配置 encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", // 时间字段的键名 LevelKey: "level", // 级别字段的键名 NameKey: "logger", // 记录器名字段的键名 CallerKey: "caller", // 调用者字段的键名 MessageKey: "msg", // 消息字段的键名 StacktraceKey: "stacktrace", // 堆栈跟踪字段的键名 LineEnding: zapcore.DefaultLineEnding, // 行结束符 // 时间格式配置 EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05.000")) }, // 日志级别格式配置(大写显示) EncodeLevel: zapcore.CapitalLevelEncoder, // 调用者信息格式配置 EncodeCaller: zapcore.ShortCallerEncoder, // 日志持续时间格式配置 EncodeDuration: zapcore.SecondsDurationEncoder, } logDir := "logs" // 创建日志目录 _ = os.MkdirAll(logDir, 0755) dateStr := time.Now().Format("2006-01-02") logFileName := filepath.Join(logDir, fmt.Sprintf("app-%s.log", dateStr)) lumberJackLogger := &lumberjack.Logger{ Filename: logFileName, // 日志文件路径 MaxSize: 100, // 每个日志文件最大大小(MB) MaxBackups: 30, // 保留的旧日志文件最大数量 MaxAge: 30, // 保留日志的最大天数 Compress: true, // 是否压缩旧的日志文件 LocalTime: true, // 使用本地时间 } // 创建控制台输出编码器(适合开发环境) //consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig) // 控制台写入器 //consoleWriteSyncer := zapcore.AddSync(os.Stdout) // 创建文件输出编码器(适合生产环境) fileEncoder := zapcore.NewJSONEncoder(encoderConfig) // 设置日志级别 logLevel := zapcore.InfoLevel // 创建多个日志写入目标 // 文件写入器(使用Lumberjack) fileWriteSyncer := zapcore.AddSync(lumberJackLogger) // 创建核心日志器,同时输出到文件和控制台 core := zapcore.NewTee( // 文件核心:JSON格式,包含所有级别日志 zapcore.NewCore(fileEncoder, fileWriteSyncer, logLevel), // 控制台核心:控制台格式,只输出INFO及以上级别 //zapcore.NewCore(consoleEncoder, consoleWriteSyncer, zapcore.InfoLevel), ) // 创建Logger实例 Logger = zap.New(core, zap.AddCaller(), // 添加调用者信息 zap.AddCallerSkip(1), // 跳过一层调用堆栈 zap.AddStacktrace(zapcore.ErrorLevel), // 错误级别添加堆栈跟踪 ) // 创建SugaredLogger(更方便的日志接口) SugarLogger = Logger.Sugar() // 替换zap全局Logger zap.ReplaceGlobals(Logger) // 记录日志初始化完成 SugarLogger.Info("日志系统初始化完成") return nil } // Sync 刷新日志缓冲区(程序退出前调用) func Sync() { if Logger != nil { _ = Logger.Sync() } } // GetLogger 获取Logger实例 func GetLogger() *zap.Logger { return Logger } // GetSugarLogger 获取SugarLogger实例 func GetSugarLogger() *zap.SugaredLogger { return SugarLogger }