logger.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package logger
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. "go.uber.org/zap/zapcore"
  6. "gopkg.in/natefinch/lumberjack.v2"
  7. "os"
  8. "path/filepath"
  9. "time"
  10. )
  11. // 全局日志实例
  12. var Logger *zap.Logger
  13. var SugarLogger *zap.SugaredLogger
  14. // InitLogger 初始化日志配置
  15. func InitLogger() error {
  16. // 创建核心日志写入器配置
  17. encoderConfig := zapcore.EncoderConfig{
  18. TimeKey: "time", // 时间字段的键名
  19. LevelKey: "level", // 级别字段的键名
  20. NameKey: "logger", // 记录器名字段的键名
  21. CallerKey: "caller", // 调用者字段的键名
  22. MessageKey: "msg", // 消息字段的键名
  23. StacktraceKey: "stacktrace", // 堆栈跟踪字段的键名
  24. LineEnding: zapcore.DefaultLineEnding, // 行结束符
  25. // 时间格式配置
  26. EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  27. enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
  28. },
  29. // 日志级别格式配置(大写显示)
  30. EncodeLevel: zapcore.CapitalLevelEncoder,
  31. // 调用者信息格式配置
  32. EncodeCaller: zapcore.ShortCallerEncoder,
  33. // 日志持续时间格式配置
  34. EncodeDuration: zapcore.SecondsDurationEncoder,
  35. }
  36. logDir := "logs"
  37. // 创建日志目录
  38. _ = os.MkdirAll(logDir, 0755)
  39. dateStr := time.Now().Format("2006-01-02")
  40. logFileName := filepath.Join(logDir, fmt.Sprintf("app-%s.log", dateStr))
  41. lumberJackLogger := &lumberjack.Logger{
  42. Filename: logFileName, // 日志文件路径
  43. MaxSize: 100, // 每个日志文件最大大小(MB)
  44. MaxBackups: 30, // 保留的旧日志文件最大数量
  45. MaxAge: 30, // 保留日志的最大天数
  46. Compress: true, // 是否压缩旧的日志文件
  47. LocalTime: true, // 使用本地时间
  48. }
  49. // 创建控制台输出编码器(适合开发环境)
  50. //consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
  51. // 控制台写入器
  52. //consoleWriteSyncer := zapcore.AddSync(os.Stdout)
  53. // 创建文件输出编码器(适合生产环境)
  54. fileEncoder := zapcore.NewJSONEncoder(encoderConfig)
  55. // 设置日志级别
  56. logLevel := zapcore.InfoLevel
  57. // 创建多个日志写入目标
  58. // 文件写入器(使用Lumberjack)
  59. fileWriteSyncer := zapcore.AddSync(lumberJackLogger)
  60. // 创建核心日志器,同时输出到文件和控制台
  61. core := zapcore.NewTee(
  62. // 文件核心:JSON格式,包含所有级别日志
  63. zapcore.NewCore(fileEncoder, fileWriteSyncer, logLevel),
  64. // 控制台核心:控制台格式,只输出INFO及以上级别
  65. //zapcore.NewCore(consoleEncoder, consoleWriteSyncer, zapcore.InfoLevel),
  66. )
  67. // 创建Logger实例
  68. Logger = zap.New(core,
  69. zap.AddCaller(), // 添加调用者信息
  70. zap.AddCallerSkip(1), // 跳过一层调用堆栈
  71. zap.AddStacktrace(zapcore.ErrorLevel), // 错误级别添加堆栈跟踪
  72. )
  73. // 创建SugaredLogger(更方便的日志接口)
  74. SugarLogger = Logger.Sugar()
  75. // 替换zap全局Logger
  76. zap.ReplaceGlobals(Logger)
  77. // 记录日志初始化完成
  78. SugarLogger.Info("日志系统初始化完成")
  79. return nil
  80. }
  81. // Sync 刷新日志缓冲区(程序退出前调用)
  82. func Sync() {
  83. if Logger != nil {
  84. _ = Logger.Sync()
  85. }
  86. }
  87. // GetLogger 获取Logger实例
  88. func GetLogger() *zap.Logger {
  89. return Logger
  90. }
  91. // GetSugarLogger 获取SugarLogger实例
  92. func GetSugarLogger() *zap.SugaredLogger {
  93. return SugarLogger
  94. }