log: improve logging interface (#12886)
parent
927eecf7c0
commit
80995f3a2d
|
@ -1,2 +1,3 @@
|
||||||
*.ppm
|
|
||||||
*.js
|
*.js
|
||||||
|
*.log
|
||||||
|
*.ppm
|
||||||
|
|
|
@ -11,8 +11,14 @@ fn main() {
|
||||||
l.info('info')
|
l.info('info')
|
||||||
l.warn('warn')
|
l.warn('warn')
|
||||||
l.error('error')
|
l.error('error')
|
||||||
l.debug('no debug')
|
l.debug('no output for debug')
|
||||||
l.set_level(.debug)
|
l.set_level(.debug)
|
||||||
l.debug('debug')
|
l.debug('debug now')
|
||||||
l.fatal('fatal')
|
l.set_level(log.level_from_tag('INFO') or { log.Level.disabled }) // set level from string, sample
|
||||||
|
l.info('info again')
|
||||||
|
l.set_level(log.level_from_tag('') or { log.Level.disabled }) // set level from string, sample
|
||||||
|
l.error('no output anymore')
|
||||||
|
l.fatal('fatal') // panic, next statements won't be executed
|
||||||
|
l.set_level(.info)
|
||||||
|
l.warn('warn')
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,22 +9,25 @@ import term
|
||||||
|
|
||||||
// Level defines possible log levels used by `Log`
|
// Level defines possible log levels used by `Log`
|
||||||
pub enum Level {
|
pub enum Level {
|
||||||
fatal = 1
|
disabled = 0
|
||||||
|
fatal
|
||||||
error
|
error
|
||||||
warn
|
warn
|
||||||
info
|
info
|
||||||
debug
|
debug
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogTarget defines possible log targets
|
||||||
pub enum LogTarget {
|
pub enum LogTarget {
|
||||||
console
|
console
|
||||||
file
|
file
|
||||||
both
|
both
|
||||||
}
|
}
|
||||||
|
|
||||||
// tag returns the tag for log level `l` as a string.
|
// tag_to_cli returns the tag for log level `l` as a colored string.
|
||||||
fn tag_to_cli(l Level) string {
|
fn tag_to_cli(l Level) string {
|
||||||
return match l {
|
return match l {
|
||||||
|
.disabled { '' }
|
||||||
.fatal { term.red('FATAL') }
|
.fatal { term.red('FATAL') }
|
||||||
.error { term.red('ERROR') }
|
.error { term.red('ERROR') }
|
||||||
.warn { term.yellow('WARN ') }
|
.warn { term.yellow('WARN ') }
|
||||||
|
@ -33,9 +36,10 @@ fn tag_to_cli(l Level) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tag returns the tag for log level `l` as a string.
|
// tag_to_file returns the tag for log level `l` as a string.
|
||||||
fn tag_to_file(l Level) string {
|
fn tag_to_file(l Level) string {
|
||||||
return match l {
|
return match l {
|
||||||
|
.disabled { ' ' }
|
||||||
.fatal { 'FATAL' }
|
.fatal { 'FATAL' }
|
||||||
.error { 'ERROR' }
|
.error { 'ERROR' }
|
||||||
.warn { 'WARN ' }
|
.warn { 'WARN ' }
|
||||||
|
@ -44,7 +48,21 @@ fn tag_to_file(l Level) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Logger {
|
// level_from_tag returns the log level from the given string if matches.
|
||||||
|
pub fn level_from_tag(tag string) ?Level {
|
||||||
|
return match tag {
|
||||||
|
'DISABLED' { Level.disabled }
|
||||||
|
'FATAL' { Level.fatal }
|
||||||
|
'ERROR' { Level.error }
|
||||||
|
'WARN' { Level.warn }
|
||||||
|
'INFO' { Level.info }
|
||||||
|
'DEBUG' { Level.debug }
|
||||||
|
else { none }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logger is an interface that describes a generic Logger
|
||||||
|
pub interface Logger {
|
||||||
fatal(s string)
|
fatal(s string)
|
||||||
error(s string)
|
error(s string)
|
||||||
warn(s string)
|
warn(s string)
|
||||||
|
@ -58,7 +76,7 @@ mut:
|
||||||
level Level
|
level Level
|
||||||
output_label string
|
output_label string
|
||||||
ofile os.File
|
ofile os.File
|
||||||
output_target LogTarget // if true output to file else use stdout/stderr.
|
output_target LogTarget // output to console (stdout/stderr) or file or both.
|
||||||
pub mut:
|
pub mut:
|
||||||
output_file_name string // log output to this file
|
output_file_name string // log output to this file
|
||||||
}
|
}
|
||||||
|
@ -148,12 +166,12 @@ pub fn (mut l Log) send_output(s &string, level Level) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// fatal logs line `s` via `send_output` if `Log.level` is greater than or equal to the `Level.fatal` category.
|
// fatal logs line `s` via `send_output` if `Log.level` is greater than or equal to the `Level.fatal` category.
|
||||||
|
// Note that this method performs a panic at the end, even if log level is not enabled.
|
||||||
pub fn (mut l Log) fatal(s string) {
|
pub fn (mut l Log) fatal(s string) {
|
||||||
if int(l.level) < int(Level.fatal) {
|
if int(l.level) >= int(Level.fatal) {
|
||||||
return
|
l.send_output(s, .fatal)
|
||||||
|
l.ofile.close()
|
||||||
}
|
}
|
||||||
l.send_output(s, .fatal)
|
|
||||||
l.ofile.close()
|
|
||||||
panic('$l.output_label: $s')
|
panic('$l.output_label: $s')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue