levels.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package log
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // Level of logging
  7. type Level int
  8. // MarshalText marshals level to text
  9. func (l Level) MarshalText() ([]byte, error) {
  10. if l >= maxLevel || l < 0 {
  11. return nil, fmt.Errorf("failed to marshal log level: level value (%d) is not in the allowed range (0-%d)", l, maxLevel-1)
  12. }
  13. return []byte(l.String()), nil
  14. }
  15. // UnmarshalText unmarshals level from text
  16. func (l *Level) UnmarshalText(text []byte) error {
  17. level, err := ParseLevel(string(text))
  18. if err != nil {
  19. return err
  20. }
  21. *l = level
  22. return nil
  23. }
  24. // Standard log levels
  25. const (
  26. TraceLevel Level = iota
  27. DebugLevel
  28. InfoLevel
  29. WarnLevel
  30. ErrorLevel
  31. FatalLevel
  32. maxLevel
  33. )
  34. func Levels() (l []Level) {
  35. for i := 0; i < int(maxLevel); i++ {
  36. l = append(l, Level(i))
  37. }
  38. return
  39. }
  40. // String values for standard log levels
  41. const (
  42. TraceString = "trace"
  43. DebugString = "debug"
  44. InfoString = "info"
  45. WarnString = "warn"
  46. ErrorString = "error"
  47. FatalString = "fatal"
  48. )
  49. // String implements Stringer interface for Level
  50. func (l Level) String() string {
  51. switch l {
  52. case TraceLevel:
  53. return TraceString
  54. case DebugLevel:
  55. return DebugString
  56. case InfoLevel:
  57. return InfoString
  58. case WarnLevel:
  59. return WarnString
  60. case ErrorLevel:
  61. return ErrorString
  62. case FatalLevel:
  63. return FatalString
  64. default:
  65. // For when new log level is not added to this func (most likely never).
  66. panic(fmt.Sprintf("unknown log level: %d", l))
  67. }
  68. }
  69. // Set implements flag.Value interface
  70. func (l *Level) Set(v string) error {
  71. lvl, err := ParseLevel(v)
  72. if err != nil {
  73. return err
  74. }
  75. *l = lvl
  76. return nil
  77. }
  78. // ParseLevel parses log level from string. Returns ErrUnknownLevel for unknown log level.
  79. func ParseLevel(l string) (Level, error) {
  80. switch strings.ToLower(l) {
  81. case TraceString:
  82. return TraceLevel, nil
  83. case DebugString:
  84. return DebugLevel, nil
  85. case InfoString:
  86. return InfoLevel, nil
  87. case WarnString:
  88. return WarnLevel, nil
  89. case ErrorString:
  90. return ErrorLevel, nil
  91. case FatalString:
  92. return FatalLevel, nil
  93. default:
  94. return FatalLevel, fmt.Errorf("unknown log level: %s", l)
  95. }
  96. }