@@ -38,7 +38,7 @@ func DefaultJSONFormatter() Formatter {
38
38
func NewJSONFormatter (keys map [string ]string , full bool ) (Formatter , error ) {
39
39
m := map [string ]string {
40
40
"name" : "name" , "time" : "time" , "level" : "level" , "message" : "message" ,
41
- "fields" : "fields" , "caller" : "caller" ,
41
+ "fields" : "fields" , "caller" : "caller" , "stack" : "stack" ,
42
42
}
43
43
44
44
structure := true
@@ -56,7 +56,7 @@ func NewJSONFormatter(keys map[string]string, full bool) (Formatter, error) {
56
56
}
57
57
f := & jsonFormatter {
58
58
name : m ["name" ], time : m ["time" ], level : m ["level" ], message : m ["message" ],
59
- fields : m ["fields" ], caller : m ["caller" ],
59
+ fields : m ["fields" ], caller : m ["caller" ], stack : m [ "stack" ],
60
60
full : full , structure : structure ,
61
61
}
62
62
return f , nil
@@ -79,6 +79,7 @@ type jsonFormatter struct {
79
79
message string
80
80
fields string
81
81
caller string
82
+ stack string
82
83
full bool
83
84
structure bool
84
85
}
@@ -91,7 +92,8 @@ type jsonFormatterObject struct {
91
92
Level string `json:"level"`
92
93
Message string `json:"message"`
93
94
Name string `json:"name,omitempty"`
94
- Time string `json:"time"`
95
+ Stack []string `json:"stack,omitempty"`
96
+ Time * string `json:"time,omitempty"`
95
97
}
96
98
97
99
// The internal temporary object pool of the json formatter.
@@ -113,7 +115,8 @@ func putJSONFormatterObject(o *jsonFormatterObject) {
113
115
o .Level = ""
114
116
o .Message = ""
115
117
o .Name = ""
116
- o .Time = ""
118
+ o .Stack = nil
119
+ o .Time = nil
117
120
118
121
jsonFormatterObjectPool .Put (o )
119
122
}
@@ -130,8 +133,9 @@ func (f *jsonFormatter) Format(e Entity, b *bytes.Buffer) error {
130
133
o .Level = e .Level ().String ()
131
134
o .Message = e .Message ()
132
135
o .Name = e .Name ()
133
- o .Time = e .TimeString ()
134
-
136
+ if tm := e .TimeString (); f .full || tm != "" {
137
+ o .Time = & tm
138
+ }
135
139
if fields := e .Fields (); len (fields ) > 0 {
136
140
o .Fields = internal .StandardiseFieldsForJSONEncoder (fields )
137
141
} else {
@@ -142,18 +146,29 @@ func (f *jsonFormatter) Format(e Entity, b *bytes.Buffer) error {
142
146
if caller := e .Caller (); f .full || caller != "" {
143
147
o .Caller = & caller
144
148
}
149
+ if stack := e .Stack (); len (stack ) > 0 {
150
+ o .Stack = stack
151
+ } else {
152
+ if f .full {
153
+ o .Stack = []string {}
154
+ }
155
+ }
145
156
// The json.Encoder.Encode method automatically adds line breaks.
146
157
return json .NewEncoder (b ).Encode (o )
147
158
}
148
159
149
160
// When the json field cannot be predicted in advance, we use map to package the log data.
150
161
// Is there a better solution to improve the efficiency of json serialization?
151
162
kv := map [string ]interface {}{
152
- f .name : e .Name (),
153
- f .time : e .TimeString (),
154
163
f .level : e .Level ().String (),
155
164
f .message : e .Message (),
156
165
}
166
+ if name := e .Name (); f .full || name != "" {
167
+ kv [f .name ] = name
168
+ }
169
+ if tm := e .TimeString (); f .full || tm != "" {
170
+ kv [f .time ] = tm
171
+ }
157
172
if fields := e .Fields (); len (fields ) > 0 {
158
173
kv [f .fields ] = internal .StandardiseFieldsForJSONEncoder (fields )
159
174
} else {
@@ -164,6 +179,13 @@ func (f *jsonFormatter) Format(e Entity, b *bytes.Buffer) error {
164
179
if caller := e .Caller (); f .full || caller != "" {
165
180
kv [f .caller ] = caller
166
181
}
182
+ if stack := e .Stack (); len (stack ) > 0 {
183
+ kv [f .stack ] = stack
184
+ } else {
185
+ if f .full {
186
+ kv [f .stack ] = []string {}
187
+ }
188
+ }
167
189
// The json.Encoder.Encode method automatically adds line breaks.
168
190
return json .NewEncoder (b ).Encode (kv )
169
191
}
0 commit comments