Logging module is now thread-safe.

This commit is contained in:
Dominik Picheta 2015-01-25 17:02:37 +00:00
commit defaf5d400
2 changed files with 30 additions and 10 deletions

View file

@ -31,13 +31,16 @@
## var L = newConsoleLogger() ## var L = newConsoleLogger()
## var fL = newFileLogger("test.log", fmtStr = verboseFmtStr) ## var fL = newFileLogger("test.log", fmtStr = verboseFmtStr)
## var rL = newRollingFileLogger("rolling.log", fmtStr = verboseFmtStr) ## var rL = newRollingFileLogger("rolling.log", fmtStr = verboseFmtStr)
## handlers.add(L) ## addHandler(L)
## handlers.add(fL) ## addHandler(fL)
## handlers.add(rL) ## addHandler(rL)
## info("920410:52 accepted") ## info("920410:52 accepted")
## warn("4 8 15 16 23 4-- Error") ## warn("4 8 15 16 23 4-- Error")
## error("922044:16 SYSTEM FAILURE") ## error("922044:16 SYSTEM FAILURE")
## fatal("SYSTEM FAILURE SYSTEM FAILURE") ## fatal("SYSTEM FAILURE SYSTEM FAILURE")
##
## **Warning:** The global list of handlers is a thread var, this means that
## the handlers must be re-added in each thread.
import strutils, os, times import strutils, os, times
@ -219,9 +222,8 @@ method log*(logger: RollingFileLogger, level: Level,
# -------- # --------
var var level {.threadvar.}: Level ## global log filter
level* = lvlAll ## global log filter var handlers {.threadvar.}: seq[Logger] ## handlers with their own log levels
handlers*: seq[Logger] = @[] ## handlers with their own log levels
proc logLoop(level: Level, frmt: string, args: varargs[string, `$`]) = proc logLoop(level: Level, frmt: string, args: varargs[string, `$`]) =
for logger in items(handlers): for logger in items(handlers):
@ -257,6 +259,22 @@ template fatal*(frmt: string, args: varargs[string, `$`]) =
## Logs a fatal error message to all registered handlers. ## Logs a fatal error message to all registered handlers.
log(lvlFatal, frmt, args) log(lvlFatal, frmt, args)
proc addHandler*(handler: Logger) =
## Adds ``handler`` to the list of handlers.
if handlers.isNil: handlers = @[]
handlers.add(handler)
proc getHandlers*(): seq[Logger] =
## Returns a list of all the registered handlers.
return handlers
proc setLogFilter*(lvl: Level) =
## Sets the global log filter.
level = lvl
proc getLogFilter*(): Level =
## Gets the global log filter.
return level
# -------------- # --------------
@ -264,9 +282,9 @@ when isMainModule:
var L = newConsoleLogger() var L = newConsoleLogger()
var fL = newFileLogger("test.log", fmtStr = verboseFmtStr) var fL = newFileLogger("test.log", fmtStr = verboseFmtStr)
var rL = newRollingFileLogger("rolling.log", fmtStr = verboseFmtStr) var rL = newRollingFileLogger("rolling.log", fmtStr = verboseFmtStr)
handlers.add(L) addHandler(L)
handlers.add(fL) addHandler(fL)
handlers.add(rL) addHandler(rL)
for i in 0 .. 25: for i in 0 .. 25:
info("hello" & $i, []) info("hello" & $i, [])

View file

@ -16,7 +16,9 @@ News
- Tuple field names are not ignored anymore, this caused too many problems - Tuple field names are not ignored anymore, this caused too many problems
in practice so now the behaviour as it was for version 0.9.6: If field in practice so now the behaviour as it was for version 0.9.6: If field
names exist for the tuple type, they are checked. names exist for the tuple type, they are checked.
- ``logging.level`` and ``logging.handlers`` are no longer exported.
``addHandler``, ``getHandlers``, ``setLogFilter`` and ``getLogFilter``
should be used instead.
Language Additions Language Additions
------------------ ------------------