MiniLogger.st
changeset 21608 492035ed86ab
parent 21507 e8f27d16c43f
child 21609 34d4dda50ad5
--- a/MiniLogger.st	Wed Mar 01 10:39:43 2017 +0100
+++ b/MiniLogger.st	Wed Mar 01 10:59:59 2017 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2012-2014 by Jan Vrany & eXept Software AG
               All Rights Reserved
@@ -15,9 +17,10 @@
 
 Object subclass:#MiniLogger
 	instanceVariableNames:''
-	classVariableNames:'ALL DEBUG ENTER ERROR FATAL INFO Instance LEAVE NONE Severities
-		TRACE TRACE0 TRACE1 TRACE2 TRACE3 Threshold WARN WARNING
-		LogOnTranscript LogOnStderr LogFormat TimestampFormat'
+	classVariableNames:'ALL DEBUG ENTER ERROR FATAL INFO Instance LEAVE LogFormat
+		LogOnStderr LogOnTranscript NONE Severities TRACE TRACE0 TRACE1
+		TRACE2 TRACE3 WARN WARNING Threshold ThresholdPerClass
+		ThresholdPerPackage TimestampFormat'
 	poolDictionaries:''
 	category:'System-Debugging-Support'
 !
@@ -349,36 +352,96 @@
 !
 
 loggingThreshold:severity 
-    "Sets logging threshold. No severity lower than given one will be logged.
-     Use `Logger severityNONE` to suppress logging completely or
-     `Logger severityALL` to log all messages"
+    "Sets logging threshold. 
+     All severities higher or equal to the given one will be logged.
+     Use `Logger severityNONE` to suppress logging completely 
+     or `Logger severityALL` to log all messages"
     
-    ((Severities includes:severity) 
-        or:[ severity == ALL or:[ severity == NONE ] ]) 
-            ifFalse:[
-                self error:'Invalid severity. Use of Logger severityXXX'.
-                ^ self.
-            ].
+    (
+        (Severities includes:severity) 
+        or:[ severity == ALL or:[ severity == NONE ] ]
+    ) ifFalse:[
+        self error:'Invalid severity. Use of Logger severityXXX'.
+        ^ self.
+    ].
     Threshold := severity
 
     "
     Logger loggingThreshold: Logger severityALL.
     Logger loggingThreshold: Logger severityINFO.
+    Logger loggingThreshold: Logger severityDEBUG.
+    
     Logger loggingThreshold: Logger severityNONE.
     "
 
     "Created: / 13-08-2014 / 14:34:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 26-08-2014 / 08:23:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (comment): / 09-10-2014 / 09:35:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 01-03-2017 / 10:42:31 / cg"
+!
+
+loggingThreshold:aLimitOrNil forClass:aClass
+    "allows individual per-class setting of the threshold (useful during debugging).
+     With a nil limit, the default is reinstalled for that class."
+
+    "/ the original scheme asked the class;
+    "/ but that required adding a getter to debugged classes, which
+    "/ is easily forgotten and checked in.
+    "/ Better keep that nfo here, so wemight even provide a GUI for it some time in the future...
+
+    "/ remember the class name - in case it is reloaded/changes identity etc.
+    aLimitOrNil isNil ifTrue:[
+        ThresholdPerClass notNil ifTrue:[
+            ThresholdPerClass removeKey:(aClass theNonMetaclass name) ifAbsent:[].
+            ThresholdPerClass isEmpty ifTrue:[
+                ThresholdPerClass := nil.
+            ].
+        ].
+        ^ self
+    ].    
+    ThresholdPerClass isNil ifTrue:[
+        ThresholdPerClass := Dictionary new.
+    ].
+    ThresholdPerClass at:aClass theNonMetaclass name put:aLimitOrNil.
+
+    "Created: / 01-03-2017 / 10:52:25 / cg"
+!
+
+loggingThreshold:aLimitOrNil forPackage:aPackageName
+    "allows individual per-package setting of the threshold (useful during debugging).
+     With a nil limit, the default is reinstalled for that class."
+
+    "/ the original scheme only asked the class;
+    "/ but that required adding many getters to debugged packages, 
+    "/ which are easily forgotten and checked in.
+    "/ Better keep that info here, so we might even provide a GUI for it some time in the future...
+
+    "/ remember the class name - in case it is reloaded/changes identity etc.
+    aLimitOrNil isNil ifTrue:[
+        ThresholdPerPackage notNil ifTrue:[
+            ThresholdPerPackage removeKey:(aPackageName) ifAbsent:[].
+            ThresholdPerPackage isEmpty ifTrue:[
+                ThresholdPerPackage := nil.
+            ].
+        ].
+        ^ self
+    ].    
+    ThresholdPerPackage isNil ifTrue:[
+        ThresholdPerPackage := Dictionary new.
+    ].
+    ThresholdPerPackage at:aPackageName put:aLimitOrNil.
+
+    "Created: / 01-03-2017 / 10:53:42 / cg"
 ! !
 
 !MiniLogger class methodsFor:'logging'!
 
 log: message
-    self log: message severity: DEBUG originator: thisContext sender receiver.
+    self log:message severity:DEBUG originator:(thisContext sender receiver).
 
     "Created: / 15-09-2011 / 10:27:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 02-12-2014 / 10:52:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-03-2017 / 10:27:52 / cg"
 !
 
 log: message facility: facility
@@ -838,18 +901,19 @@
 !MiniLogger class methodsFor:'private'!
 
 facilityOf:originator 
-    ^ originator class 
-        perform:#logFacility
-        ifNotUnderstood:[
-            |pkg|
-
-            pkg := originator class package.
-            (pkg startsWith:'stx') ifTrue:[
-                'STX'
-            ] ifFalse:[
-                pkg copyFrom:((pkg lastIndexOf:$:) + 1)
-            ]
-        ]
+    ^ originator class logFacility
+"/    ^ originator class
+"/        perform:#logFacility
+"/        ifNotUnderstood:[
+"/            |pkg|
+"/
+"/            pkg := originator class package.
+"/            (pkg startsWith:'stx') ifTrue:[
+"/                'STX'
+"/            ] ifFalse:[
+"/                pkg copyFrom:((pkg lastIndexOf:$:) + 1)
+"/            ]
+"/        ]
 
     "
      Logger facilityOf: Object
@@ -857,6 +921,7 @@
     "
 
     "Created: / 15-09-2011 / 10:20:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-03-2017 / 10:43:23 / cg"
 !
 
 log: message severity: severity facility: facilityArg originator: originator attachment: attachment on:aStream
@@ -923,7 +988,7 @@
      Logger log:'test message' severity: DEBUG facility: 'TEST'
      Logger log:'test message' severity: INFO facility: 'TEST'
      Logger log:'test message' asUnicode16String severity: INFO facility: 'TEST'
-     Logger log:'test message äöüß' severity: INFO facility: 'TEST'
+     Logger log:'test message äöüß' severity: INFO facility: 'TEST'
      Logger log:'test message' severity: WARNING facility: 'TEST'
      Logger log:'test message' severity: ERROR facility: 'TEST'
      'test message' infoPrintCR
@@ -943,18 +1008,37 @@
 severityThresholdOf:originator
     "allow each class to define an individual threshold for Logging"
 
-    ^ originator class 
-        perform:#logSeverityThreshold
-        ifNotUnderstood:[
-            ^ Threshold.
-        ]
+    |cls t|
 
+    cls := originator class.
+    ThresholdPerClass notNil ifTrue:[
+        t := ThresholdPerClass at:(cls theNonMetaclass name) ifAbsent:nil.
+        t notNil ifTrue:[^ t].
+    ].
+    ThresholdPerPackage notNil ifTrue:[
+        t := ThresholdPerPackage at:(cls package) ifAbsent:nil.
+        t notNil ifTrue:[^ t].
+    ].
+
+    "/ disabled; the above scheme is better...
+    "/ ^ cls 
+    "/    perform:#logSeverityThreshold
+    "/     ifNotUnderstood:[ ^ Threshold ]
+    ^ Threshold
+    
     "
      Logger severityThresholdOf: Object
      Logger severityThresholdOf: Expecco::Browser
+
+     Logger loggingThreshold:(Logger severityDEBUG) forClass:(Expecco::Browser).
+     Logger loggingThreshold:(Logger severityDEBUG) forPackage:'stx:libbasic'.
+
+     Logger loggingThreshold:nil forClass:(Expecco::Browser).
+     Logger loggingThreshold:nil forPackage:'stx:libbasic'.
     "
 
     "Created: / 15-09-2011 / 10:20:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 01-03-2017 / 10:59:12 / cg"
 ! !
 
 !MiniLogger::Severity methodsFor:'accessing'!