This repository has been archived by the owner on Feb 21, 2023. It is now read-only.
/
message.go
135 lines (117 loc) · 2.72 KB
/
message.go
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
package gomol
import (
"fmt"
"math"
"strings"
"time"
)
// LogLevel represents the level a message is logged at.
type LogLevel int
const (
// LevelDebug designates messages that are most useful when debugging applications.
LevelDebug LogLevel = 7
// LevelInfo designates messages that show application progression
LevelInfo LogLevel = 6
// LevelWarning designates messages that could potentially cause problems
LevelWarning LogLevel = 4
// LevelError designates error messages that don't stop the application from running
LevelError LogLevel = 3
// LevelFatal designates messages for severe errors where the application cannot continue
LevelFatal LogLevel = 2
// LevelNone is used when configuring log levels to disable all log levels
LevelNone LogLevel = math.MinInt32
)
func (ll *LogLevel) MarshalJSON() ([]byte, error) {
jsonLevel := getLevelName(*ll)
jsonData := append([]byte{'"'}, append([]byte(jsonLevel), '"')...)
return jsonData, nil
}
func (ll *LogLevel) UnmarshalJSON(data []byte) error {
levelStr := strings.Trim(string(data), `"`)
jsonLevel, err := ToLogLevel(levelStr)
if err != nil {
return err
}
*ll = jsonLevel
return nil
}
// ToLogLevel will take a string and return the appropriate log level for
// the string if known. If the string is not recognized it will return
// an ErrUnknownLevel error.
func ToLogLevel(level string) (LogLevel, error) {
lowLevel := strings.ToLower(level)
switch lowLevel {
case "dbg":
fallthrough
case "debug":
return LevelDebug, nil
case "info":
return LevelInfo, nil
case "warn":
fallthrough
case "warning":
return LevelWarning, nil
case "err":
fallthrough
case "error":
return LevelError, nil
case "fatal":
return LevelFatal, nil
case "none":
return LevelNone, nil
}
return 0, ErrUnknownLevel
}
func (ll LogLevel) String() string {
return getLevelName(ll)
}
func getLevelName(level LogLevel) string {
switch level {
case LevelNone:
return "none"
case LevelDebug:
return "debug"
case LevelInfo:
return "info"
case LevelWarning:
return "warn"
case LevelError:
return "error"
case LevelFatal:
return "fatal"
default:
return "unknown"
}
}
// Message holds the information for a log message
type Message struct {
base *Base
Level LogLevel
Timestamp time.Time
Attrs *Attrs
Msg string
}
func newMessage(timestamp time.Time,
base *Base,
level LogLevel,
msgAttrs *Attrs,
format string, va ...interface{}) *Message {
msgStr := format
if len(va) > 0 {
msgStr = fmt.Sprintf(format, va...)
}
var attrs *Attrs
if msgAttrs != nil {
attrs = msgAttrs
} else {
attrs = NewAttrs()
}
nm := &Message{
base: base,
Level: level,
Timestamp: timestamp,
Attrs: attrs,
Msg: msgStr,
}
return nm
}