zap.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 init() {
  18. if ok, _ := utils.PathExists(global.GVA_CONFIG.Zap.Director); !ok { // 判断是否有logs文件夹
  19. fmt.Println("create logs directory") // directory not exist
  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. default:
  32. level = zap.InfoLevel
  33. }
  34. writer, err = getWriteSyncer() // 使用file-rotatelogs进行日志分割
  35. if err != nil {
  36. fmt.Printf("Get Write Syncer Failed err:%v", err.Error())
  37. return
  38. }
  39. if level == zap.DebugLevel || level == zap.ErrorLevel {
  40. global.GVA_ZAP = zap.New(getEncoderCore(), zap.AddStacktrace(level))
  41. if global.GVA_CONFIG.Zap.ShowLine {
  42. global.GVA_ZAP.WithOptions(zap.AddCaller())
  43. }
  44. return
  45. }
  46. global.GVA_ZAP = zap.New(getEncoderCore())
  47. if global.GVA_CONFIG.Zap.ShowLine {
  48. global.GVA_ZAP.WithOptions(zap.AddCaller())
  49. }
  50. }
  51. // getWriteSyncer zap logger中加入file-rotatelogs
  52. func getWriteSyncer() (zapcore.WriteSyncer, error) {
  53. fileWriter, err := zaprotatelogs.New(
  54. global.GVA_CONFIG.Zap.Director+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
  55. zaprotatelogs.WithLinkName(global.GVA_CONFIG.Zap.LinkName),
  56. zaprotatelogs.WithMaxAge(7*24*time.Hour),
  57. zaprotatelogs.WithRotationTime(24*time.Hour),
  58. )
  59. if global.GVA_CONFIG.Zap.LogInConsole {
  60. return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(fileWriter)), err
  61. }
  62. return zapcore.AddSync(fileWriter), err
  63. }
  64. // getEncoderConfig 获取zapcore.EncoderConfig
  65. func getEncoderConfig() (config zapcore.EncoderConfig) {
  66. config = zapcore.EncoderConfig{
  67. MessageKey: "message",
  68. LevelKey: "level",
  69. TimeKey: "time",
  70. NameKey: "logger",
  71. CallerKey: "caller",
  72. StacktraceKey: "stacktrace",
  73. LineEnding: zapcore.DefaultLineEnding,
  74. EncodeLevel: zapcore.CapitalColorLevelEncoder,
  75. EncodeTime: CustomTimeEncoder,
  76. EncodeDuration: zapcore.SecondsDurationEncoder,
  77. EncodeCaller: zapcore.FullCallerEncoder,
  78. }
  79. return config
  80. }
  81. // getEncoder 获取zapcore.Encoder
  82. func getEncoder() zapcore.Encoder {
  83. return zapcore.NewConsoleEncoder(getEncoderConfig())
  84. }
  85. // getEncoderCore 获取Encoder的zapcore.Core
  86. func getEncoderCore() (core zapcore.Core) {
  87. return zapcore.NewCore(getEncoder(), writer, level)
  88. }
  89. // 自定义日志输出时间格式
  90. func CustomTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  91. enc.AppendString(t.Format(global.GVA_CONFIG.Zap.Prefix+"2006/01/02 - 15:04:05.000"))
  92. }