Merge pull request #2911 from avsej/fix-logger-formatting

Fix logger formatting
This commit is contained in:
Andreas Rumpf 2015-06-13 13:51:20 +02:00
commit ccf8c88f29

View file

@ -19,7 +19,12 @@
## ============ ======================= ## ============ =======================
## $date Current date ## $date Current date
## $time Current time ## $time Current time
## $datetime $dateT$time
## $app ``os.getAppFilename()`` ## $app ``os.getAppFilename()``
## $appname base name of $app
## $appdir directory name of $app
## $levelid first letter of log level
## $levelname log level name
## ============ ======================= ## ============ =======================
## ##
## ##
@ -59,8 +64,8 @@ const
"DEBUG", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "NONE" "DEBUG", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "NONE"
] ]
defaultFmtStr* = "" ## default string between log level and message per logger defaultFmtStr* = "$levelname " ## default format string
verboseFmtStr* = "$date $time " verboseFmtStr* = "$levelid, [$datetime] -- $appname: "
type type
Logger* = ref object of RootObj ## abstract logger; the base type of all loggers Logger* = ref object of RootObj ## abstract logger; the base type of all loggers
@ -87,12 +92,11 @@ type
{.deprecated: [TLevel: Level, PLogger: Logger, PConsoleLogger: ConsoleLogger, {.deprecated: [TLevel: Level, PLogger: Logger, PConsoleLogger: ConsoleLogger,
PFileLogger: FileLogger, PRollingFileLogger: RollingFileLogger].} PFileLogger: FileLogger, PRollingFileLogger: RollingFileLogger].}
proc substituteLog(frmt: string): string = proc substituteLog(frmt: string, level: Level, args: varargs[string, `$`]): string =
## converts $date to the current date var msgLen = 0
## converts $time to the current time for arg in args:
## converts $app to getAppFilename() msgLen += arg.len
## converts result = newStringOfCap(frmt.len + msgLen + 20)
result = newStringOfCap(frmt.len + 20)
var i = 0 var i = 0
while i < frmt.len: while i < frmt.len:
if frmt[i] != '$': if frmt[i] != '$':
@ -108,10 +112,15 @@ proc substituteLog(frmt: string): string =
case v case v
of "date": result.add(getDateStr()) of "date": result.add(getDateStr())
of "time": result.add(getClockStr()) of "time": result.add(getClockStr())
of "datetime": result.add(getDateStr() & "T" & getClockStr())
of "app": result.add(app) of "app": result.add(app)
of "appdir": result.add(app.splitFile.dir) of "appdir": result.add(app.splitFile.dir)
of "appname": result.add(app.splitFile.name) of "appname": result.add(app.splitFile.name)
of "levelid": result.add(LevelNames[level][0])
of "levelname": result.add(LevelNames[level])
else: discard else: discard
for arg in args:
result.add(arg)
method log*(logger: Logger, level: Level, args: varargs[string, `$`]) {. method log*(logger: Logger, level: Level, args: varargs[string, `$`]) {.
raises: [Exception], raises: [Exception],
@ -123,12 +132,12 @@ method log*(logger: Logger, level: Level, args: varargs[string, `$`]) {.
method log*(logger: ConsoleLogger, level: Level, args: varargs[string, `$`]) = method log*(logger: ConsoleLogger, level: Level, args: varargs[string, `$`]) =
## Logs to the console using ``logger`` only. ## Logs to the console using ``logger`` only.
if level >= logger.levelThreshold: if level >= logger.levelThreshold:
writeln(stdout, LevelNames[level], " ", substituteLog(logger.fmtStr), args) writeln(stdout, substituteLog(logger.fmtStr, level, args))
method log*(logger: FileLogger, level: Level, args: varargs[string, `$`]) = method log*(logger: FileLogger, level: Level, args: varargs[string, `$`]) =
## Logs to a file using ``logger`` only. ## Logs to a file using ``logger`` only.
if level >= logger.levelThreshold: if level >= logger.levelThreshold:
writeln(logger.f, LevelNames[level], " ", substituteLog(logger.fmtStr), args) writeln(logger.f, substituteLog(logger.fmtStr, level, args))
proc defaultFilename*(): string = proc defaultFilename*(): string =
## Returns the default filename for a logger. ## Returns the default filename for a logger.
@ -219,7 +228,7 @@ method log*(logger: RollingFileLogger, level: Level, args: varargs[string, `$`])
logger.curLine = 0 logger.curLine = 0
logger.f = open(logger.baseName, logger.baseMode, bufSize = logger.bufSize) logger.f = open(logger.baseName, logger.baseMode, bufSize = logger.bufSize)
writeln(logger.f, LevelNames[level], " ", substituteLog(logger.fmtStr), args) writeln(logger.f, substituteLog(logger.fmtStr, level, args))
logger.curLine.inc logger.curLine.inc
# -------- # --------