logger.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package logger
  2. import (
  3. cfg "MeterService/core/config"
  4. "errors"
  5. "io"
  6. "log"
  7. "sync"
  8. "time"
  9. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  10. "go.uber.org/zap"
  11. "go.uber.org/zap/zapcore"
  12. )
  13. var (
  14. Logger *zap.Logger
  15. loggerMu sync.Mutex
  16. )
  17. func init() {
  18. err := InitLogger()
  19. if err != nil {
  20. log.Println("logger初始化失败")
  21. panic(err)
  22. }
  23. }
  24. func InitLogger() error {
  25. loggerMu.Lock()
  26. defer loggerMu.Unlock()
  27. config := getConfig()
  28. encoder := createEncoder(config.LogType)
  29. logLevel := getLogLevel(config.Level)
  30. var cores []zapcore.Core
  31. switch config.FileType {
  32. case "level":
  33. debugCore := zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("debug", config.FileFormat)), zap.DebugLevel)
  34. infoCore := zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("info", config.FileFormat)), zap.InfoLevel)
  35. errorCore := zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("error", config.FileFormat)), zap.ErrorLevel)
  36. cores = append(cores, debugCore, infoCore, errorCore)
  37. default:
  38. core := zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("all", config.FileFormat)), logLevel)
  39. cores = append(cores, core)
  40. }
  41. core := zapcore.NewTee(cores...)
  42. newLogger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel))
  43. if newLogger == nil {
  44. return errors.New("failed to initialize logger")
  45. }
  46. Logger = newLogger
  47. return nil
  48. }
  49. func getConfig() *cfg.LoggerConfig {
  50. return &cfg.C.Logger
  51. }
  52. func createEncoder(logType string) zapcore.Encoder {
  53. config := zapcore.EncoderConfig{
  54. TimeKey: "ts",
  55. LevelKey: "level",
  56. MessageKey: "msg",
  57. EncodeTime: customEncodeTime,
  58. EncodeDuration: customEncodeDuration,
  59. EncodeCaller: zapcore.ShortCallerEncoder,
  60. }
  61. if logType == "json" {
  62. return zapcore.NewJSONEncoder(config)
  63. }
  64. return zapcore.NewConsoleEncoder(config)
  65. }
  66. func getLogLevel(level string) zapcore.Level {
  67. var logLevel zapcore.Level
  68. switch level {
  69. case "debug":
  70. logLevel = zap.DebugLevel
  71. case "info":
  72. logLevel = zap.InfoLevel
  73. case "error":
  74. logLevel = zap.ErrorLevel
  75. default:
  76. logLevel = zap.InfoLevel // 默认日志级别
  77. }
  78. return logLevel
  79. }
  80. func getLoggerWriter(filename, fileFormat string) io.Writer {
  81. filePath, saveDay := "./logs", 30
  82. if cfg.C.Logger.FilePath != "" {
  83. filePath = cfg.C.Logger.FilePath
  84. }
  85. if cfg.C.Logger.MaxSaveDays > 0 {
  86. saveDay = cfg.C.Logger.MaxSaveDays
  87. }
  88. filename = filePath + "/" + filename
  89. // 日志切割
  90. hook, err := rotatelogs.New(
  91. filename+"/"+fileFormat+".log",
  92. //rotatelogs.WithLinkName(filename),
  93. rotatelogs.WithMaxAge(time.Duration(saveDay)*24*time.Hour),
  94. rotatelogs.WithRotationTime(24*time.Hour),
  95. )
  96. if err != nil {
  97. log.Printf("日志启动异常: %v\n", err)
  98. return nil
  99. }
  100. return hook
  101. }
  102. func customEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  103. enc.AppendString(t.Format("2006-01-02 15:04:05"))
  104. }
  105. func customEncodeDuration(duration time.Duration, encoder zapcore.PrimitiveArrayEncoder) {
  106. encoder.AppendInt64(int64(duration) / 100000000) // nano -> milli
  107. }
  108. func Debug(format string, v ...interface{}) {
  109. if cfg.C.Vber.Mode == "debug" {
  110. if v == nil {
  111. Logger.Sugar().Debug(format)
  112. } else {
  113. Logger.Sugar().Debugf(format, v...)
  114. }
  115. }
  116. }
  117. func Info(format string, v ...interface{}) {
  118. if v == nil {
  119. Logger.Sugar().Info(format)
  120. } else {
  121. Logger.Sugar().Infof(format, v...)
  122. }
  123. }
  124. func Error(format string, v ...interface{}) {
  125. if v == nil {
  126. Logger.Sugar().Error(format)
  127. } else {
  128. Logger.Sugar().Errorf(format, v...)
  129. }
  130. }