summary refs log tree commit diff stats
path: root/devel
diff options
context:
space:
mode:
authorYury Benesh <ybxsoft@tut.by>2012-08-01 22:12:14 +0300
committerYury Benesh <ybxsoft@tut.by>2012-08-01 22:12:14 +0300
commit3f200d3e23ebf973570582bc48caf2cf769d4415 (patch)
treedefc99752c9a0c0758431b08756c134675f805ba /devel
parent3580f029612ed9713e00c58133aa1f30f4eabe97 (diff)
downloadNim-3f200d3e23ebf973570582bc48caf2cf769d4415.tar.gz
Added default format for logging.
Diffstat (limited to 'devel')
-rw-r--r--devel/logging.nim93
1 files changed, 64 insertions, 29 deletions
diff --git a/devel/logging.nim b/devel/logging.nim
index 9ae36b4da..57b34ce5e 100644
--- a/devel/logging.nim
+++ b/devel/logging.nim
@@ -35,42 +35,31 @@ const
     "DEBUG", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "NONE"
   ]
 
+  defaultFmtStr = "" ## default string between log level and message per logger
+  verboseFmtStr = "$date $time "
+
 type
   TLogger* = object of TObject ## abstract logger; the base type of all loggers
     levelThreshold*: TLevel    ## only messages of level >= levelThreshold 
                                ## should be processed
+    fmtStr: string ## = defaultFmtStr by default, see substituteLog for $date etc.
+    
   TConsoleLogger* = object of TLogger ## logger that writes the messages to the
                                       ## console
   
   TFileLogger* = object of TLogger ## logger that writes the messages to a file
     f: TFile
   
-  # TODO: implement rolling log
+  # TODO: implement rolling log, will produce filename.1, filename.2 etc.
   TRollingFileLogger* = object of TFileLogger ## logger that writes the 
                                               ## message to a file
-    maxLines: int # maximum number of lines
-    lines: seq[string]
+    maxLines: int # maximum number of lines    
     curLine : int
+    baseName: string # initial filename
+    logFiles: int # how many log files already created, e.g. basename.1, basename.2...
+    
     
 
-method log*(L: ref TLogger, level: TLevel,
-            frmt: string, args: openArray[string]) =
-  ## override this method in custom loggers. Default implementation does
-  ## nothing.
-  nil
-  
-method log*(L: ref TConsoleLogger, level: TLevel,
-            frmt: string, args: openArray[string]) = 
-    Writeln(stdout, LevelNames[level], " ", frmt % args)
-
-method log*(L: ref TFileLogger, level: TLevel, 
-            frmt: string, args: openArray[string]) = 
-    Writeln(L.f, LevelNames[level], " ", frmt % args)
-
-proc defaultFilename*(): string = 
-  ## returns the default filename for a logger
-  var (path, name, ext) = splitFile(getAppFilename())
-  result = changeFileExt(path / name & "_" & getDateStr(), "log")
 
 proc substituteLog*(frmt: string): string = 
   ## converts $date to the current date
@@ -96,41 +85,75 @@ proc substituteLog*(frmt: string): string =
       of "app":  result.add(app)
       of "appdir": result.add(app.splitFile.dir)
       of "appname": result.add(app.splitFile.name)
+
+
+
+method log*(L: ref TLogger, level: TLevel,
+            frmt: string, args: openArray[string]) =
+  ## override this method in custom loggers. Default implementation does
+  ## nothing.
+  nil
+  
+method log*(L: ref TConsoleLogger, level: TLevel,
+            frmt: string, args: openArray[string]) = 
+    Writeln(stdout, LevelNames[level], " ", substituteLog(L.fmtStr), frmt % args)
+
+method log*(L: ref TFileLogger, level: TLevel, 
+            frmt: string, args: openArray[string]) = 
+    Writeln(L.f, LevelNames[level], " ", substituteLog(L.fmtStr), frmt % args)
+
+proc defaultFilename*(): string = 
+  ## returns the default filename for a logger
+  var (path, name, ext) = splitFile(getAppFilename())
+  result = changeFileExt(path / name & "_" & getDateStr(), "log")
+
       
 
+
+proc newConsoleLogger*(levelThreshold = lvlAll) : ref TConsoleLogger =
+  new result
+  result.fmtStr = defaultFmtStr
+  result.levelThreshold = levelThreshold
+
 proc newFileLogger*(filename = defaultFilename(), 
                     mode: TFileMode = fmAppend,
                     levelThreshold = lvlAll): ref TFileLogger = 
   new(result)
   result.levelThreshold = levelThreshold
   result.f = open(filename, mode)
+  result.fmtStr = defaultFmtStr
 
 # ------
 
+proc readLogLines(logger : ref TRollingFileLogger) = nil
+  #f.readLine # TODO read all lines, update curLine
+
+
 proc newRollingFileLogger*(filename = defaultFilename(), 
                            mode: TFileMode = fmReadWrite,
                            levelThreshold = lvlAll,
                            maxLines = 1000): ref TRollingFileLogger = 
   new(result)
   result.levelThreshold = levelThreshold
+  result.fmtStr = defaultFmtStr
   result.maxLines = maxLines
   result.f = open(filename, mode)
   result.curLine = 0
-  if mode in {fmReadWrite, fmReadWriteExisting}:
-    readLogLines(result)
+  
+  # TODO count all number files
+  # count lines in existing filename file
+  # if >= maxLines then rename to next numbered file and create new file
+  
+  #if mode in {fmReadWrite, fmReadWriteExisting}:
+  #  readLogLines(result)
 
-proc readLogLines(logger : ref TRollingFileLogger) =
-  f.readLine # TODO read all lines, update curLine
 
 
 method log*(L: ref TRollingFileLogger, level: TLevel, 
             frmt: string, args: openArray[string]) = 
   # TODO 
   # if more than maxlines, then set cursor to zero
-  # otherwise add new line
-  # update line in the lines
-  # increment cursor
-  # store lines into file
+  
   Writeln(L.f, LevelNames[level], " ", frmt % args)
 
 # --------
@@ -173,3 +196,15 @@ template fatal*(frmt: string, args: openarray[string]) =
   ## logs a fatal error message
   log(lvlFatal, frmt, args)
 
+
+# --------------
+
+when isMainModule:
+  var L = newConsoleLogger()
+  var fL = newFileLogger("test.log")
+  fL.fmtStr = verboseFmtStr
+  handlers.add(L)
+  handlers.add(fL)
+  info("hello", [])
+  
+