Skip to content

Commit 1d8fdc0

Browse files
committed
feat(logging): added log format option, grafana#4590
1 parent 7d6cda4 commit 1d8fdc0

File tree

3 files changed

+71
-16
lines changed

3 files changed

+71
-16
lines changed

conf/defaults.ini

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,18 +251,23 @@ templates_pattern = emails/*.html
251251
# Use space to separate multiple modes, e.g. "console file"
252252
mode = console, file
253253

254-
# Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Info"
255-
level = Info
254+
# Either "trace", "debug", "info", "warn", "error", "critical", default is "info"
255+
level = info
256256

257257
# For "console" mode only
258258
[log.console]
259259
level =
260-
# Set formatting to "false" to disable color formatting of console logs
261-
formatting = false
260+
261+
# log line format, valid options are text, console and json
262+
format = console
262263

263264
# For "file" mode only
264265
[log.file]
265266
level =
267+
268+
# log line format, valid options are text, console and json
269+
format = text
270+
266271
# This enables automated log rotate(switch of following options), default is true
267272
log_rotate = true
268273

@@ -280,6 +285,10 @@ max_days = 7
280285

281286
[log.syslog]
282287
level =
288+
289+
# log line format, valid options are text, console and json
290+
format = text
291+
283292
# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used.
284293
network =
285294
address =
@@ -290,6 +299,7 @@ facility =
290299
# Syslog tag. By default, the process' argv[0] is used.
291300
tag =
292301

302+
293303
#################################### AMQP Event Publisher ##########################
294304
[event_publisher]
295305
enabled = false

conf/sample.ini

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,19 +230,26 @@ check_for_updates = true
230230
#################################### Logging ##########################
231231
[log]
232232
# Either "console", "file", "syslog". Default is console and file
233-
# Use comma to separate multiple modes, e.g. "console, file"
233+
# Use space to separate multiple modes, e.g. "console file"
234234
;mode = console, file
235235

236-
# Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Info"
237-
;level = Info
236+
# Either "trace", "debug", "info", "warn", "error", "critical", default is "info"
237+
;level = info
238238

239239
# For "console" mode only
240240
[log.console]
241241
;level =
242242

243+
# log line format, valid options are text, console and json
244+
;format = console
245+
243246
# For "file" mode only
244247
[log.file]
245248
;level =
249+
250+
# log line format, valid options are text, console and json
251+
;format = text
252+
246253
# This enables automated log rotate(switch of following options), default is true
247254
;log_rotate = true
248255

@@ -258,6 +265,23 @@ check_for_updates = true
258265
# Expired days of log file(delete after max days), default is 7
259266
;max_days = 7
260267

268+
[log.syslog]
269+
;level =
270+
271+
# log line format, valid options are text, console and json
272+
;format = text
273+
274+
# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used.
275+
;network =
276+
;address =
277+
278+
# Syslog facility. user, daemon and local0 through local7 are valid.
279+
;facility =
280+
281+
# Syslog tag. By default, the process' argv[0] is used.
282+
;tag =
283+
284+
261285
#################################### AMQP Event Publisher ##########################
262286
[event_publisher]
263287
;enabled = false

pkg/log/log.go

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"gopkg.in/ini.v1"
1414

1515
"github.com/inconshreveable/log15"
16+
"github.com/inconshreveable/log15/term"
1617
)
1718

1819
var Root log15.Logger
@@ -82,16 +83,17 @@ func Close() {
8283
}
8384

8485
var logLevels = map[string]log15.Lvl{
85-
"Trace": log15.LvlDebug,
86-
"Debug": log15.LvlDebug,
87-
"Info": log15.LvlInfo,
88-
"Warn": log15.LvlWarn,
89-
"Error": log15.LvlError,
90-
"Critical": log15.LvlCrit,
86+
"trace": log15.LvlDebug,
87+
"debug": log15.LvlDebug,
88+
"info": log15.LvlInfo,
89+
"warn": log15.LvlWarn,
90+
"error": log15.LvlError,
91+
"critical": log15.LvlCrit,
9192
}
9293

9394
func getLogLevelFromConfig(key string, defaultName string, cfg *ini.File) (string, log15.Lvl) {
94-
levelName := cfg.Section(key).Key("level").In(defaultName, []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"})
95+
levelName := cfg.Section(key).Key("level").MustString("info")
96+
levelName = strings.ToLower(levelName)
9597
level := getLogLevelFromString(levelName)
9698
return levelName, level
9799
}
@@ -118,10 +120,26 @@ func getFilters(filterStrArray []string) map[string]log15.Lvl {
118120
return filterMap
119121
}
120122

123+
func getLogFormat(format string) log15.Format {
124+
switch format {
125+
case "console":
126+
if term.IsTty(os.Stdout.Fd()) {
127+
return log15.TerminalFormat()
128+
}
129+
return log15.LogfmtFormat()
130+
case "text":
131+
return log15.LogfmtFormat()
132+
case "json":
133+
return log15.JsonFormat()
134+
default:
135+
return log15.LogfmtFormat()
136+
}
137+
}
138+
121139
func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
122140
Close()
123141

124-
defaultLevelName, _ := getLogLevelFromConfig("log", "Info", cfg)
142+
defaultLevelName, _ := getLogLevelFromConfig("log", "info", cfg)
125143
defaultFilters := getFilters(cfg.Section("log").Key("filters").Strings(" "))
126144

127145
handlers := make([]log15.Handler, 0)
@@ -136,18 +154,20 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
136154
// Log level.
137155
_, level := getLogLevelFromConfig("log."+mode, defaultLevelName, cfg)
138156
modeFilters := getFilters(sec.Key("filters").Strings(" "))
157+
format := getLogFormat(sec.Key("format").MustString(""))
139158

140159
var handler log15.Handler
141160

142161
// Generate log configuration.
143162
switch mode {
144163
case "console":
145-
handler = log15.StdoutHandler
164+
handler = log15.StreamHandler(os.Stdout, format)
146165
case "file":
147166
fileName := sec.Key("file_name").MustString(filepath.Join(logsPath, "grafana.log"))
148167
os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
149168
fileHandler := NewFileWriter()
150169
fileHandler.Filename = fileName
170+
fileHandler.Format = format
151171
fileHandler.Rotate = sec.Key("log_rotate").MustBool(true)
152172
fileHandler.Maxlines = sec.Key("max_lines").MustInt(1000000)
153173
fileHandler.Maxsize = 1 << uint(sec.Key("max_size_shift").MustInt(28))
@@ -159,6 +179,7 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
159179
handler = fileHandler
160180
case "syslog":
161181
sysLogHandler := NewSyslog()
182+
sysLogHandler.Format = format
162183
sysLogHandler.Network = sec.Key("network").MustString("")
163184
sysLogHandler.Address = sec.Key("address").MustString("")
164185
sysLogHandler.Facility = sec.Key("facility").MustString("local7")

0 commit comments

Comments
 (0)