zap.go 3.6 KB

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