log.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package logger2
  2. import (
  3. cfg "MeterService/core/config"
  4. "io"
  5. "log"
  6. "time"
  7. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  8. "go.uber.org/zap"
  9. "go.uber.org/zap/zapcore"
  10. )
  11. var Logger *zap.Logger
  12. func InitLogger() {
  13. config := zapcore.EncoderConfig{
  14. TimeKey: "ts",
  15. LevelKey: "level",
  16. MessageKey: "msg",
  17. //CallerKey: "file",
  18. EncodeLevel: zapcore.CapitalLevelEncoder,
  19. EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  20. enc.AppendString(t.Format("2006-01-02 15:04:05"))
  21. },
  22. EncodeDuration: func(duration time.Duration, encoder zapcore.PrimitiveArrayEncoder) {
  23. encoder.AppendInt64(int64(duration) / 100000000) // nano -> milli
  24. },
  25. EncodeCaller: zapcore.ShortCallerEncoder,
  26. }
  27. encoder := zapcore.NewConsoleEncoder(config)
  28. if cfg.C.Logger.LogType == "json" {
  29. encoder = zapcore.NewJSONEncoder(config)
  30. }
  31. fileFormat, saveType, logLevelStr := "%Y%m%d", "one", "info"
  32. if cfg.C.Logger.FileFormat != "" {
  33. fileFormat = cfg.C.Logger.FileFormat
  34. }
  35. if cfg.C.Logger.Level != "" {
  36. logLevelStr = cfg.C.Logger.Level
  37. }
  38. if cfg.C.Logger.FileType != "" {
  39. saveType = cfg.C.Logger.FileType
  40. }
  41. logLevel := zap.DebugLevel
  42. switch logLevelStr {
  43. case "debug":
  44. logLevel = zap.DebugLevel
  45. case "info":
  46. logLevel = zap.InfoLevel
  47. case "error":
  48. logLevel = zap.ErrorLevel
  49. }
  50. switch saveType {
  51. case "level":
  52. Logger = getLevelLogger(encoder, logLevel, fileFormat)
  53. default:
  54. Logger = getOneLogger(encoder, logLevel, fileFormat)
  55. }
  56. }
  57. func getLevelLogger(encoder zapcore.Encoder, logLevel zapcore.Level, fileFormat string) *zap.Logger {
  58. debugLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
  59. return lvl >= logLevel && lvl == zap.DebugLevel
  60. })
  61. infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
  62. return lvl >= logLevel && lvl == zap.InfoLevel
  63. })
  64. errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
  65. return lvl >= logLevel && lvl == zap.ErrorLevel
  66. })
  67. core := zapcore.NewTee(
  68. zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("debug", fileFormat)), debugLevel),
  69. zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("info", fileFormat)), infoLevel),
  70. zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("error", fileFormat)), errorLevel),
  71. )
  72. return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel))
  73. }
  74. func getOneLogger(encoder zapcore.Encoder, logLevel zapcore.Level, fileFormat string) *zap.Logger {
  75. core := zapcore.NewCore(encoder, zapcore.AddSync(getLoggerWriter("all", fileFormat)), logLevel)
  76. return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel))
  77. }
  78. func getLoggerWriter(filename, fileFormat string) io.Writer {
  79. filePath, saveDay := "./logs", 30
  80. if cfg.C.Logger.FilePath != "" {
  81. filePath = cfg.C.Logger.FilePath
  82. }
  83. if cfg.C.Logger.MaxSaveDays > 0 {
  84. saveDay = cfg.C.Logger.MaxSaveDays
  85. }
  86. filename = filePath + "/" + filename
  87. hook, err := rotatelogs.New(filename+"/"+fileFormat+".log",
  88. rotatelogs.WithLinkName(filename),
  89. rotatelogs.WithMaxAge(time.Duration(saveDay)*24*time.Hour),
  90. rotatelogs.WithRotationTime(24*time.Hour),
  91. )
  92. if err != nil {
  93. log.Println("日志启动异常")
  94. panic(err)
  95. }
  96. return hook
  97. }
  98. func Debug(format string, v ...interface{}) {
  99. if cfg.C.Vber.Mode == "debug" {
  100. if v == nil {
  101. Logger.Sugar().Debug(format)
  102. } else {
  103. Logger.Sugar().Debugf(format, v...)
  104. }
  105. }
  106. }
  107. func Info(format string, v ...interface{}) {
  108. if v == nil {
  109. Logger.Sugar().Info(format)
  110. } else {
  111. Logger.Sugar().Infof(format, v...)
  112. }
  113. }
  114. func Error(format string, v ...interface{}) {
  115. if v == nil {
  116. Logger.Sugar().Error(format)
  117. } else {
  118. Logger.Sugar().Errorf(format, v...)
  119. }
  120. }