logging.nim: expose underlying 'file' object; errors and fatals flush the buffer; refs #3270
This commit is contained in:
parent
e0f896785d
commit
c7a3079123
1 changed files with 13 additions and 10 deletions
|
|
@ -77,7 +77,7 @@ type
|
||||||
## console
|
## console
|
||||||
|
|
||||||
FileLogger* = ref object of Logger ## logger that writes the messages to a file
|
FileLogger* = ref object of Logger ## logger that writes the messages to a file
|
||||||
f: File
|
file*: File ## the wrapped file.
|
||||||
|
|
||||||
RollingFileLogger* = ref object of FileLogger ## logger that writes the
|
RollingFileLogger* = ref object of FileLogger ## logger that writes the
|
||||||
## messages to a file and
|
## messages to a file and
|
||||||
|
|
@ -126,7 +126,7 @@ proc substituteLog*(frmt: string, level: Level, args: varargs[string, `$`]): str
|
||||||
|
|
||||||
method log*(logger: Logger, level: Level, args: varargs[string, `$`]) {.
|
method log*(logger: Logger, level: Level, args: varargs[string, `$`]) {.
|
||||||
raises: [Exception],
|
raises: [Exception],
|
||||||
tags: [TimeEffect, WriteIOEffect, ReadIOEffect].} =
|
tags: [TimeEffect, WriteIOEffect, ReadIOEffect], base.} =
|
||||||
## Override this method in custom loggers. Default implementation does
|
## Override this method in custom loggers. Default implementation does
|
||||||
## nothing.
|
## nothing.
|
||||||
discard
|
discard
|
||||||
|
|
@ -135,15 +135,17 @@ 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:
|
||||||
writeLine(stdout, substituteLog(logger.fmtStr, level, args))
|
writeLine(stdout, substituteLog(logger.fmtStr, level, args))
|
||||||
|
if level in {lvlError, lvlFatal}: flushFile(stdout)
|
||||||
|
|
||||||
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:
|
||||||
writeLine(logger.f, substituteLog(logger.fmtStr, level, args))
|
writeLine(logger.file, substituteLog(logger.fmtStr, level, args))
|
||||||
|
if level in {lvlError, lvlFatal}: flushFile(logger.file)
|
||||||
|
|
||||||
proc defaultFilename*(): string =
|
proc defaultFilename*(): string =
|
||||||
## Returns the default filename for a logger.
|
## Returns the default filename for a logger.
|
||||||
var (path, name, ext) = splitFile(getAppFilename())
|
var (path, name, _) = splitFile(getAppFilename())
|
||||||
result = changeFileExt(path / name, "log")
|
result = changeFileExt(path / name, "log")
|
||||||
|
|
||||||
proc newConsoleLogger*(levelThreshold = lvlAll, fmtStr = defaultFmtStr): ConsoleLogger =
|
proc newConsoleLogger*(levelThreshold = lvlAll, fmtStr = defaultFmtStr): ConsoleLogger =
|
||||||
|
|
@ -162,14 +164,14 @@ proc newFileLogger*(filename = defaultFilename(),
|
||||||
## (-1: use system defaults, 0: unbuffered, >0: fixed buffer size).
|
## (-1: use system defaults, 0: unbuffered, >0: fixed buffer size).
|
||||||
new(result)
|
new(result)
|
||||||
result.levelThreshold = levelThreshold
|
result.levelThreshold = levelThreshold
|
||||||
result.f = open(filename, mode, bufSize = bufSize)
|
result.file = open(filename, mode, bufSize = bufSize)
|
||||||
result.fmtStr = fmtStr
|
result.fmtStr = fmtStr
|
||||||
|
|
||||||
# ------
|
# ------
|
||||||
|
|
||||||
proc countLogLines(logger: RollingFileLogger): int =
|
proc countLogLines(logger: RollingFileLogger): int =
|
||||||
result = 0
|
result = 0
|
||||||
for line in logger.f.lines():
|
for line in logger.file.lines():
|
||||||
result.inc()
|
result.inc()
|
||||||
|
|
||||||
proc countFiles(filename: string): int =
|
proc countFiles(filename: string): int =
|
||||||
|
|
@ -202,7 +204,7 @@ proc newRollingFileLogger*(filename = defaultFilename(),
|
||||||
result.fmtStr = fmtStr
|
result.fmtStr = fmtStr
|
||||||
result.maxLines = maxLines
|
result.maxLines = maxLines
|
||||||
result.bufSize = bufSize
|
result.bufSize = bufSize
|
||||||
result.f = open(filename, mode, bufSize=result.bufSize)
|
result.file = open(filename, mode, bufSize=result.bufSize)
|
||||||
result.curLine = 0
|
result.curLine = 0
|
||||||
result.baseName = filename
|
result.baseName = filename
|
||||||
result.baseMode = mode
|
result.baseMode = mode
|
||||||
|
|
@ -224,13 +226,14 @@ method log*(logger: RollingFileLogger, level: Level, args: varargs[string, `$`])
|
||||||
## Logs to a file using rolling ``logger`` only.
|
## Logs to a file using rolling ``logger`` only.
|
||||||
if level >= logger.levelThreshold:
|
if level >= logger.levelThreshold:
|
||||||
if logger.curLine >= logger.maxLines:
|
if logger.curLine >= logger.maxLines:
|
||||||
logger.f.close()
|
logger.file.close()
|
||||||
rotate(logger)
|
rotate(logger)
|
||||||
logger.logFiles.inc
|
logger.logFiles.inc
|
||||||
logger.curLine = 0
|
logger.curLine = 0
|
||||||
logger.f = open(logger.baseName, logger.baseMode, bufSize = logger.bufSize)
|
logger.file = open(logger.baseName, logger.baseMode, bufSize = logger.bufSize)
|
||||||
|
|
||||||
writeLine(logger.f, substituteLog(logger.fmtStr, level, args))
|
writeLine(logger.file, substituteLog(logger.fmtStr, level, args))
|
||||||
|
if level in {lvlError, lvlFatal}: flushFile(logger.file)
|
||||||
logger.curLine.inc
|
logger.curLine.inc
|
||||||
|
|
||||||
# --------
|
# --------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue