zap.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package config
  2. import (
  3. "go.uber.org/zap/zapcore"
  4. "time"
  5. )
  6. type Zap struct {
  7. Level string `mapstructure:"level" json:"level" yaml:"level"` // 级别
  8. Prefix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"` // 日志前缀
  9. Format string `mapstructure:"format" json:"format" yaml:"format"` // 输出
  10. Director string `mapstructure:"director" json:"director" yaml:"director"` // 日志文件夹
  11. EncodeLevel string `mapstructure:"encode-level" json:"encode-level" yaml:"encode-level"` // 编码级
  12. StacktraceKey string `mapstructure:"stacktrace-key" json:"stacktrace-key" yaml:"stacktrace-key"` // 栈名
  13. ShowLine bool `mapstructure:"show-line" json:"show-line" yaml:"show-line"` // 显示行
  14. LogInConsole bool `mapstructure:"log-in-console" json:"log-in-console" yaml:"log-in-console"` // 输出控制台
  15. RetentionDay int `mapstructure:"retention-day" json:"retention-day" yaml:"retention-day"` // 日志保留天数
  16. }
  17. // Levels 根据字符串转化为 zapcore.Levels
  18. func (c *Zap) Levels() []zapcore.Level {
  19. levels := make([]zapcore.Level, 0, 7)
  20. level, err := zapcore.ParseLevel(c.Level)
  21. if err != nil {
  22. level = zapcore.DebugLevel
  23. }
  24. for ; level <= zapcore.FatalLevel; level++ {
  25. levels = append(levels, level)
  26. }
  27. return levels
  28. }
  29. func (c *Zap) Encoder() zapcore.Encoder {
  30. config := zapcore.EncoderConfig{
  31. TimeKey: "time",
  32. NameKey: "name",
  33. LevelKey: "level",
  34. CallerKey: "caller",
  35. MessageKey: "message",
  36. StacktraceKey: c.StacktraceKey,
  37. LineEnding: zapcore.DefaultLineEnding,
  38. EncodeTime: func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {
  39. encoder.AppendString(c.Prefix + t.Format("2006-01-02 15:04:05.000"))
  40. },
  41. EncodeLevel: c.LevelEncoder(),
  42. EncodeCaller: zapcore.FullCallerEncoder,
  43. EncodeDuration: zapcore.SecondsDurationEncoder,
  44. }
  45. if c.Format == "json" {
  46. return zapcore.NewJSONEncoder(config)
  47. }
  48. return zapcore.NewConsoleEncoder(config)
  49. }
  50. // LevelEncoder 根据 EncodeLevel 返回 zapcore.LevelEncoder
  51. // Author [SliverHorn](https://github.com/SliverHorn)
  52. func (c *Zap) LevelEncoder() zapcore.LevelEncoder {
  53. switch {
  54. case c.EncodeLevel == "LowercaseLevelEncoder": // 小写编码器(默认)
  55. return zapcore.LowercaseLevelEncoder
  56. case c.EncodeLevel == "LowercaseColorLevelEncoder": // 小写编码器带颜色
  57. return zapcore.LowercaseColorLevelEncoder
  58. case c.EncodeLevel == "CapitalLevelEncoder": // 大写编码器
  59. return zapcore.CapitalLevelEncoder
  60. case c.EncodeLevel == "CapitalColorLevelEncoder": // 大写编码器带颜色
  61. return zapcore.CapitalColorLevelEncoder
  62. default:
  63. return zapcore.LowercaseLevelEncoder
  64. }
  65. }