minpkg/core/minilogger.nim
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 |
import
strutils
type
Level* = enum lvlAll, lvlDebug, lvlInfo, lvlNotice, lvlWarn, lvlError, lvlFatal, lvlNone
const
LevelNames: array[Level, string] = [ "DEBUG", "DEBUG", "INFO", "NOTICE", "WARN", "ERROR", "FATAL", "NONE"]
var LOGLEVEL* {.threadvar.}: Level
LOGLEVEL = lvlNotice
proc logPrefix(level: Level): string =
case level:
of lvlDebug:
return ("---")
of lvlInfo:
return ("(i)")
of lvlNotice:
return (" ")
of lvlWarn:
return ("(!)")
of lvlError:
return ("(!)")
of lvlFatal:
return ("(x)")
else:
return (" ")
when defined(js):
proc log*(level: Level; args: varargs[string, `$`]) =
#TODOJS
discard
else:
proc log*(level: Level; args: varargs[string, `$`]) =
var f = stdout
if level >= LOGLEVEL:
if level >= lvlWarn:
f = stderr
let prefix = level.logPrefix()
f.write(prefix&" ")
f.write(args.join(" "))
f.write("\n")
if level in {lvlError, lvlFatal}: flushFile(f)
proc fatal*(args: varargs[string, `$`]) =
log(lvlFatal, args)
proc error*(args: varargs[string, `$`]) =
log(lvlError, args)
proc warn*(args: varargs[string, `$`]) =
log(lvlWarn, args)
proc notice*(args: varargs[string, `$`]) =
log(lvlNotice, args)
proc info*(args: varargs[string, `$`]) =
log(lvlInfo, args)
proc debug*(args: varargs[string, `$`]) =
log(lvlDebug, args)
proc getLogLevel*(): string =
return LevelNames[LOGLEVEL].toLowerAscii
proc setLogFilter*(lvl: Level) =
LOGLEVEL = lvl
proc setLogLevel*(val: var string): string {.discardable.} =
var lvl: Level
case val:
of "debug":
lvl = lvlDebug
of "info":
lvl = lvlInfo
of "notice":
lvl = lvlNotice
of "warn":
lvl = lvlWarn
of "error":
lvl = lvlError
of "fatal":
lvl = lvlFatal
of "none":
lvl = lvlNone
else:
val = "warn"
lvl = lvlWarn
LOGLEVEL = lvl
return val
|