log.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package bootstrap
  2. import (
  3. "fmt"
  4. "io"
  5. "path/filepath"
  6. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  7. "designs/config"
  8. "designs/global"
  9. "designs/utils"
  10. "go.uber.org/zap"
  11. "go.uber.org/zap/zapcore"
  12. // "gopkg.in/natefinch/lumberjack.v2"
  13. "os"
  14. "time"
  15. )
  16. var (
  17. level zapcore.Level // zap 日志等级
  18. options []zap.Option // zap 配置项
  19. )
  20. func InitializeLog() (*zap.SugaredLogger, io.Writer) {
  21. // 创建根目录
  22. createRootDir()
  23. // 设置日志等级
  24. setLogLevel()
  25. if config.GetBool("log.showLine") {
  26. options = append(options, zap.AddCaller())
  27. }
  28. writer := getLogWriter() // file-rotatelogs
  29. // 初始化 zap
  30. logger := zap.New(getZapCore(writer), options...)
  31. return logger.Sugar(), writer
  32. }
  33. func createRootDir() {
  34. if ok, _ := utils.PathExists(config.Get("log.rootDir")); !ok {
  35. if err := os.Mkdir(config.Get("log.rootDir"), os.ModePerm); err != nil {
  36. panic(fmt.Errorf("mkdir log root dir failed: %s, %s \n", config.Get("log.rootDir"), err))
  37. }
  38. }
  39. }
  40. func setLogLevel() {
  41. switch config.Get("log.level") {
  42. case "debug":
  43. level = zap.DebugLevel
  44. options = append(options, zap.AddStacktrace(level))
  45. case "info":
  46. level = zap.InfoLevel
  47. case "warn":
  48. level = zap.WarnLevel
  49. case "error":
  50. level = zap.ErrorLevel
  51. options = append(options, zap.AddStacktrace(level))
  52. case "dpanic":
  53. level = zap.DPanicLevel
  54. case "panic":
  55. level = zap.PanicLevel
  56. case "fatal":
  57. level = zap.FatalLevel
  58. default:
  59. level = zap.InfoLevel
  60. }
  61. }
  62. // 扩展 Zap
  63. func getZapCore(writer io.Writer) zapcore.Core {
  64. var encoder zapcore.Encoder
  65. // 调整编码器默认配置
  66. encoderConfig := zap.NewProductionEncoderConfig()
  67. encoderConfig.EncodeTime = func(time time.Time, encoder zapcore.PrimitiveArrayEncoder) {
  68. encoder.AppendString(time.Format("[" + "2006-01-02 15:04:05.000" + "]"))
  69. }
  70. encoderConfig.EncodeLevel = func(l zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
  71. encoder.AppendString(config.Get("app.env") + "." + l.String())
  72. }
  73. // 设置编码器
  74. if config.Get("log.format") == "json" {
  75. encoder = zapcore.NewJSONEncoder(encoderConfig)
  76. } else {
  77. encoder = zapcore.NewConsoleEncoder(encoderConfig)
  78. }
  79. syncWriter := zapcore.AddSync(writer)
  80. return zapcore.NewCore(encoder, syncWriter, level)
  81. }
  82. func getLogWriter() io.Writer {
  83. logFile := config.Get("log.filename")
  84. writer, err := rotatelogs.New(
  85. filepath.Join(global.App.PwdPath, "storage", "logs", logFile),
  86. rotatelogs.WithMaxAge(-1),
  87. rotatelogs.WithRotationTime(24*time.Hour),
  88. )
  89. if err != nil {
  90. panic(fmt.Errorf("failed to create rotatelogs: %s", err))
  91. }
  92. return writer
  93. }