zap.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package core
  2. import (
  3. "fmt"
  4. "gin-vue-admin/global"
  5. "gin-vue-admin/utils"
  6. zaprotatelogs "github.com/lestrrat-go/file-rotatelogs"
  7. "go.uber.org/zap"
  8. "go.uber.org/zap/zapcore"
  9. "os"
  10. "path"
  11. "time"
  12. )
  13. var level zapcore.Level
  14. func Zap() (logger *zap.Logger) {
  15. if ok, _ := utils.PathExists(global.GVA_CONFIG.Zap.Director); !ok { // 判断是否有Director文件夹
  16. fmt.Printf("create %v directory\n", global.GVA_CONFIG.Zap.Director)
  17. _ = os.Mkdir(global.GVA_CONFIG.Zap.Director, os.ModePerm)
  18. }
  19. switch global.GVA_CONFIG.Zap.Level { // 初始化配置文件的Level
  20. case "debug":
  21. level = zap.DebugLevel
  22. case "info":
  23. level = zap.InfoLevel
  24. case "warn":
  25. level = zap.WarnLevel
  26. case "error":
  27. level = zap.ErrorLevel
  28. case "dpanic":
  29. level = zap.DPanicLevel
  30. case "panic":
  31. level = zap.PanicLevel
  32. case "fatal":
  33. level = zap.FatalLevel
  34. default:
  35. level = zap.InfoLevel
  36. }
  37. if level == zap.DebugLevel || level == zap.ErrorLevel {
  38. logger = zap.New(getEncoderCore(), zap.AddStacktrace(level))
  39. } else {
  40. logger = zap.New(getEncoderCore())
  41. }
  42. if global.GVA_CONFIG.Zap.ShowLine {
  43. logger.WithOptions(zap.AddCaller())
  44. }
  45. return logger
  46. }
  47. // getWriteSyncer zap logger中加入file-rotatelogs
  48. func getWriteSyncer() (zapcore.WriteSyncer, error) {
  49. fileWriter, err := zaprotatelogs.New(
  50. path.Join(global.GVA_CONFIG.Zap.Director, "%Y-%m-%d.log"),
  51. zaprotatelogs.WithLinkName(global.GVA_CONFIG.Zap.LinkName),
  52. zaprotatelogs.WithMaxAge(7*24*time.Hour),
  53. zaprotatelogs.WithRotationTime(24*time.Hour),
  54. )
  55. if global.GVA_CONFIG.Zap.LogInConsole {
  56. return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(fileWriter)), err
  57. }
  58. return zapcore.AddSync(fileWriter), err
  59. }
  60. // getEncoderConfig 获取zapcore.EncoderConfig
  61. func getEncoderConfig() (config zapcore.EncoderConfig) {
  62. config = zapcore.EncoderConfig{
  63. MessageKey: "message",
  64. LevelKey: "level",
  65. TimeKey: "time",
  66. NameKey: "logger",
  67. CallerKey: "caller",
  68. StacktraceKey: global.GVA_CONFIG.Zap.StacktraceKey,
  69. LineEnding: zapcore.DefaultLineEnding,
  70. EncodeLevel: zapcore.LowercaseLevelEncoder,
  71. EncodeTime: CustomTimeEncoder,
  72. EncodeDuration: zapcore.SecondsDurationEncoder,
  73. EncodeCaller: zapcore.FullCallerEncoder,
  74. }
  75. switch {
  76. case global.GVA_CONFIG.Zap.EncodeLevel == "LowercaseLevelEncoder": // 小写编码器(默认)
  77. config.EncodeLevel = zapcore.LowercaseLevelEncoder
  78. case global.GVA_CONFIG.Zap.EncodeLevel == "LowercaseColorLevelEncoder": // 小写编码器带颜色
  79. config.EncodeLevel = zapcore.LowercaseColorLevelEncoder
  80. case global.GVA_CONFIG.Zap.EncodeLevel == "CapitalLevelEncoder": // 大写编码器
  81. config.EncodeLevel = zapcore.CapitalLevelEncoder
  82. case global.GVA_CONFIG.Zap.EncodeLevel == "CapitalColorLevelEncoder": // 大写编码器带颜色
  83. config.EncodeLevel = zapcore.CapitalColorLevelEncoder
  84. default:
  85. config.EncodeLevel = zapcore.LowercaseLevelEncoder
  86. }
  87. return config
  88. }
  89. // getEncoder 获取zapcore.Encoder
  90. func getEncoder() zapcore.Encoder {
  91. if global.GVA_CONFIG.Zap.Format == "json" {
  92. return zapcore.NewJSONEncoder(getEncoderConfig())
  93. }
  94. return zapcore.NewConsoleEncoder(getEncoderConfig())
  95. }
  96. // getEncoderCore 获取Encoder的zapcore.Core
  97. func getEncoderCore() (core zapcore.Core) {
  98. writer, err := getWriteSyncer() // 使用file-rotatelogs进行日志分割
  99. if err != nil {
  100. fmt.Printf("Get Write Syncer Failed err:%v", err.Error())
  101. return
  102. }
  103. return zapcore.NewCore(getEncoder(), writer, level)
  104. }
  105. // 自定义日志输出时间格式
  106. func CustomTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  107. enc.AppendString(t.Format(global.GVA_CONFIG.Zap.Prefix + "2006/01/02 - 15:04:05.000"))
  108. }