Repository navigation
Expand file tree
/
Copy pathlevel.go
More file actions
154 lines (133 loc) · 4.15 KB
/
Copy pathlevel.go
File metadata and controls
154 lines (133 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package logging
import (
"fmt"
"strconv"
"strings"
)
const (
levelTraceName = "trace"
levelDebugName = "debug"
levelInfoName = "info"
levelWarnName = "warn"
levelErrorName = "error"
levelPanicName = "panic"
levelFatalName = "fatal"
levelUnknownName = "Level"
)
// Level is a type for logging levels.
type Level int
// Logging levels constants.
const (
// LevelTrace defines constant logging level for most verbose logging in debug env.
LevelTrace Level = 0
// LevelDebug defines constant logging level for detailed logging in debug env.
LevelDebug Level = 1
// LevelInfo defines constant logging level for info, warnings and errors reporting.
// It is used as DefaultLevel for all new loggers when level is not set directly.
LevelInfo Level = 2
// LevelWarn defines constant logging level for warnings and errors reporting only.
LevelWarn Level = 3
// LevelError defines constant logging level for only errors reporting.
LevelError Level = 4
// LevelPanic defines constant logging level for application panic reporting.
LevelPanic Level = 5
// LevelFatal defines constant logging level for fatal errors reporting.
// Logger.Fatal logs the message and terminates the process regardless of the logger level.
LevelFatal Level = 6
// DefaultLevel defines default level if omitted.
DefaultLevel = LevelInfo
)
// IsEnabledForLevel detects if logger with such Level suitable to produce messages with specified level.
// Used to filter messages in Logger.Trace, Logger.Debug, Logger.Info, Logger.Warn, Logger.Error
// and formatting method companions Logger.Tracef, Logger.Debugf, Logger.Infof, Logger.Warnf, Logger.Errorf.
func (l Level) IsEnabledForLevel(level Level) bool {
return level >= l
}
// String returns level string representation. Implements fmt.Stringer.
func (l Level) String() string {
switch l {
case LevelTrace:
return levelTraceName
case LevelDebug:
return levelDebugName
case LevelInfo:
return levelInfoName
case LevelWarn:
return levelWarnName
case LevelError:
return levelErrorName
case LevelPanic:
return levelPanicName
case LevelFatal:
return levelFatalName
default:
return levelUnknownName + "(" + strconv.Itoa(int(l)) + ")"
}
}
// UnmarshalText makes it easy to configure logging levels using YAML,
// TOML or JSON files.
func (l *Level) UnmarshalText(text []byte) error {
if l == nil {
return fmt.Errorf("%w: unmarshal into nil", Error)
}
switch strings.ToLower(strings.TrimSpace(string(text))) {
case levelTraceName, "t", "trc":
*l = LevelTrace
case levelDebugName, "d", "dbg":
*l = LevelDebug
case levelInfoName, "i", "inf":
*l = LevelInfo
case levelWarnName, "warning", "w", "wrn":
*l = LevelWarn
case levelErrorName, "e", "err":
*l = LevelError
case levelPanicName, "p":
*l = LevelPanic
case levelFatalName, "f":
*l = LevelFatal
default:
return fmt.Errorf("%w: unrecognized level: %q", Error, text)
}
return nil
}
// ParseLevel parses a level name, f.e. "debug" or "warning". It is case insensitive and accepts
// the same names as Level.UnmarshalText. Returns DefaultLevel and error if the name is not recognized.
func ParseLevel(name string) (Level, error) {
var level Level
if err := level.UnmarshalText([]byte(name)); err != nil {
return DefaultLevel, err
}
return level, nil
}
// valid reports the level is one of defined levels.
func (l Level) valid() bool {
return l >= LevelTrace && l <= LevelFatal
}
// MarshalText marshals level value to text representation.
// Implements encoding.TextMarshaler.
func (l Level) MarshalText() (text []byte, err error) {
switch l {
case LevelTrace:
return []byte(levelTraceName), nil
case LevelDebug:
return []byte(levelDebugName), nil
case LevelInfo:
return []byte(levelInfoName), nil
case LevelWarn:
return []byte(levelWarnName), nil
case LevelError:
return []byte(levelErrorName), nil
case LevelPanic:
return []byte(levelPanicName), nil
case LevelFatal:
return []byte(levelFatalName), nil
default:
return nil, fmt.Errorf("%w: unknown level value %v", Error, l)
}
}
// WithLevel is an Option setting the global logging level in Config.
func WithLevel(level Level) Option {
return func(c *Config) {
c.Level = level
}
}