| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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
- }
|