Propagate exceptions from shutdown() if raiseExceptions is not set.
authorVinay Sajip <vinay_sajip@yahoo.co.uk>
Thu, 9 Feb 2006 08:34:14 +0000 (08:34 +0000)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>
Thu, 9 Feb 2006 08:34:14 +0000 (08:34 +0000)
Added 'extra' keyword argument handling to logging calls, as discussed on python-dev.

Lib/logging/__init__.py

index da4c1921faa3141f28312e8bd2897dd54217b327..561654919c4caec3e4a157e87f5586d38a54828b 100644 (file)
@@ -1053,14 +1053,20 @@ class Logger(Filterer):
                 continue
             return filename, f.f_lineno, co.co_name
 
-    def makeRecord(self, name, level, fn, lno, msg, args, exc_info):
+    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, extra=None):
         """
         A factory method which can be overridden in subclasses to create
         specialized LogRecords.
         """
-        return LogRecord(name, level, fn, lno, msg, args, exc_info)
+        rv = LogRecord(name, level, fn, lno, msg, args, exc_info)
+        if extra:
+            for key in extra:
+                if (key in ["message", "asctime"]) or (key in rv.__dict__):
+                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
+                rv.__dict__[key] = extra[key]
+        return rv
 
-    def _log(self, level, msg, args, exc_info=None):
+    def _log(self, level, msg, args, exc_info=None, extra=None):
         """
         Low-level logging routine which creates a LogRecord and then calls
         all the handlers of this logger to handle the record.
@@ -1072,7 +1078,7 @@ class Logger(Filterer):
         if exc_info:
             if type(exc_info) != types.TupleType:
                 exc_info = sys.exc_info()
-        record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info)
+        record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info, extra)
         self.handle(record)
 
     def handle(self, record):
@@ -1324,12 +1330,14 @@ def shutdown():
     """
     for h in _handlerList[:]: # was _handlers.keys():
         #errors might occur, for example, if files are locked
-        #we just ignore them
+        #we just ignore them if raiseExceptions is not set
         try:
             h.flush()
             h.close()
         except:
-            pass
+            if raiseExceptions:
+                raise
+            #else, swallow
 
 #Let's try and shutdown automatically on application exit...
 try: