logger.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package logger
  2. import (
  3. "log"
  4. "strings"
  5. "go.uber.org/zap"
  6. "go.uber.org/zap/zapcore"
  7. )
  8. var Log *zap.Logger
  9. var Sugar *zap.SugaredLogger
  10. var Std *log.Logger
  11. // Init 初始化全局 zap 日志。
  12. //
  13. // env 环境标识:pro 使用生产配置(默认 Warn),其他使用开发配置(默认 Info)。
  14. // level 强制指定的日志级别(debug/info/warn/error),为空时使用对应环境的默认级别。
  15. func Init(env string, level string) error {
  16. opt := zap.AddStacktrace(zap.ErrorLevel) // error 日志打印堆栈信息
  17. // 解析强制指定的级别;未指定或非法时 forced 为 nil,表示使用环境默认级别。
  18. forced := parseLevel(level)
  19. var err error
  20. if env == "pro" {
  21. // Log, err = zap.NewProduction(opt)
  22. Log, err = newProduction(forced, opt)
  23. log.Println("zap init newProduction")
  24. } else {
  25. // Log, err = zap.NewDevelopment(opt)
  26. Log, err = newDevelopment(forced, opt)
  27. log.Println("zap init newDevelopment")
  28. }
  29. if err == nil {
  30. Sugar = Log.Sugar()
  31. }
  32. zap.ReplaceGlobals(Log) // 全局logger,zap.L() 和 zap.S() 需要调用 ReplaceGlobals 函数才会记录日志信息
  33. // 之后可以使用zap.L()代替Log,zap.S()代替Sugar
  34. Std = zap.NewStdLog(Log) // 标准输入自动转换为 zap.logger日志
  35. return err
  36. }
  37. // parseLevel 解析级别字符串,支持 debug/info/warn(warning)/error,不区分大小写。
  38. // 无法识别(含空串)时返回 nil,调用方据此回退到环境默认级别。
  39. func parseLevel(level string) *zapcore.Level {
  40. switch strings.ToLower(strings.TrimSpace(level)) {
  41. case "debug":
  42. l := zapcore.DebugLevel
  43. return &l
  44. case "info":
  45. l := zapcore.InfoLevel
  46. return &l
  47. case "warn", "warning":
  48. l := zapcore.WarnLevel
  49. return &l
  50. case "error":
  51. l := zapcore.ErrorLevel
  52. return &l
  53. default:
  54. return nil
  55. }
  56. }
  57. func newProduction(forced *zapcore.Level, options ...zap.Option) (*zap.Logger, error) {
  58. lvl := zapcore.WarnLevel // 生产环境默认 Warn
  59. if forced != nil {
  60. lvl = *forced
  61. }
  62. config := zap.Config{
  63. Level: zap.NewAtomicLevelAt(lvl),
  64. Development: false,
  65. Sampling: &zap.SamplingConfig{
  66. Initial: 100,
  67. Thereafter: 100,
  68. },
  69. Encoding: "json",
  70. EncoderConfig: zap.NewProductionEncoderConfig(),
  71. OutputPaths: []string{"stderr"},
  72. ErrorOutputPaths: []string{"stderr"},
  73. }
  74. return config.Build(options...)
  75. }
  76. func newDevelopment(forced *zapcore.Level, options ...zap.Option) (*zap.Logger, error) {
  77. lvl := zapcore.InfoLevel // 开发环境默认 Info
  78. if forced != nil {
  79. lvl = *forced
  80. }
  81. config := zap.Config{
  82. Level: zap.NewAtomicLevelAt(lvl),
  83. Development: true,
  84. Encoding: "console",
  85. EncoderConfig: zap.NewDevelopmentEncoderConfig(),
  86. OutputPaths: []string{"stderr"},
  87. ErrorOutputPaths: []string{"stderr"},
  88. }
  89. return config.Build(options...)
  90. }