[Python-checkins] python/dist/src/Lib/logging handlers.py,1.8,1.9

vsajip at users.sourceforge.net vsajip at users.sourceforge.net
Fri Feb 20 08:17:30 EST 2004


Update of /cvsroot/python/python/dist/src/Lib/logging
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11829

Modified Files:
	handlers.py 
Log Message:
Copyright year change.
Corrections to comments.
Tracebacks can now be sent via SocketHandler.
SocketHandler now uses exponential backoff strategy.
Handlers now chain to Handler.close() from their close() methods.

Index: handlers.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/logging/handlers.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** handlers.py	8 Nov 2003 11:40:03 -0000	1.8
--- handlers.py	20 Feb 2004 13:17:27 -0000	1.9
***************
*** 20,26 ****
  
  Should work under Python versions >= 1.5.2, except that source line
! information is not available unless 'inspect' is.
  
! Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
  
  To use, simply 'import logging' and log away!
--- 20,26 ----
  
  Should work under Python versions >= 1.5.2, except that source line
! information is not available unless 'sys._getframe()' is.
  
! Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved.
  
  To use, simply 'import logging' and log away!
***************
*** 133,136 ****
--- 133,143 ----
          self.sock = None
          self.closeOnError = 0
+         self.retryTime = None
+         #
+         # Exponential backoff parameters.
+         #
+         self.retryStart = 1.0
+         self.retryMax = 30.0
+         self.retryFactor = 2.0
  
      def makeSocket(self):
***************
*** 143,146 ****
--- 150,181 ----
          return s
  
+     def createSocket(self):
+         """
+         Try to create a socket, using an exponential backoff with
+         a max retry time. Thanks to Robert Olson for the original patch
+         (SF #815911) which has been slightly refactored.
+         """
+         now = time.time()
+         # Either retryTime is None, in which case this
+         # is the first time back after a disconnect, or
+         # we've waited long enough.
+         if self.retryTime is None:
+           attempt = 1
+         else:
+           attempt = (now >= self.retryTime)
+         if attempt:
+             try:
+                 self.sock = self.makeSocket()
+                 self.retryTime = None # next time, no delay before trying
+             except:
+                 #Creation failed, so set the retry time and return.
+                 if self.retryTime is None:
+                     self.retryPeriod = self.retryStart
+                 else:
+                     self.retryPeriod = self.retryPeriod * self.retryFactor
+                     if self.retryPeriod > self.retryMax:
+                         self.retryPeriod = self.retryMax
+                 self.retryTime = now + self.retryPeriod
+ 
      def send(self, s):
          """
***************
*** 150,162 ****
          network is busy.
          """
!         if hasattr(self.sock, "sendall"):
!             self.sock.sendall(s)
!         else:
!             sentsofar = 0
!             left = len(s)
!             while left > 0:
!                 sent = self.sock.send(s[sentsofar:])
!                 sentsofar = sentsofar + sent
!                 left = left - sent
  
      def makePickle(self, record):
--- 185,207 ----
          network is busy.
          """
!         if self.sock is None:
!             self.createSocket()
!         #self.sock can be None either because we haven't reached the retry
!         #time yet, or because we have reached the retry time and retried,
!         #but are still unable to connect.
!         if self.sock:
!             try:
!                 if hasattr(self.sock, "sendall"):
!                     self.sock.sendall(s)
!                 else:
!                     sentsofar = 0
!                     left = len(s)
!                     while left > 0:
!                         sent = self.sock.send(s[sentsofar:])
!                         sentsofar = sentsofar + sent
!                         left = left - sent
!             except socket.error:
!                 self.sock.close()
!                 self.sock = None  # so we can call createSocket next time
  
      def makePickle(self, record):
***************
*** 165,171 ****
          returns it ready for transmission across the socket.
          """
          s = cPickle.dumps(record.__dict__, 1)
!         #n = len(s)
!         #slen = "%c%c" % ((n >> 8) & 0xFF, n & 0xFF)
          slen = struct.pack(">L", len(s))
          return slen + s
--- 210,220 ----
          returns it ready for transmission across the socket.
          """
+         ei = record.exc_info
+         if ei:
+           dummy = self.format(record) # just to get traceback text into record.exc_text
+           record.exc_info = None  # to avoid Unpickleable error
          s = cPickle.dumps(record.__dict__, 1)
!         if ei:
!           record.exc_info = ei  # for next handler
          slen = struct.pack(">L", len(s))
          return slen + s
***************
*** 196,201 ****
          try:
              s = self.makePickle(record)
-             if not self.sock:
-                 self.sock = self.makeSocket()
              self.send(s)
          except:
--- 245,248 ----
***************
*** 209,212 ****
--- 256,260 ----
              self.sock.close()
              self.sock = None
+         logging.Handler.close(self)
  
  class DatagramHandler(SocketHandler):
***************
*** 387,390 ****
--- 435,439 ----
          if self.unixsocket:
              self.socket.close()
+         logging.Handler.close(self)
  
      def emit(self, record):
***************
*** 581,585 ****
          """
          #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
!         pass
  
  class HTTPHandler(logging.Handler):
--- 630,634 ----
          """
          #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
!         logging.Handler.close(self)
  
  class HTTPHandler(logging.Handler):
***************
*** 604,608 ****
          """
          Default implementation of mapping the log record into a dict
!         that is send as the CGI data. Overwrite in your class.
          Contributed by Franz  Glasner.
          """
--- 653,657 ----
          """
          Default implementation of mapping the log record into a dict
!         that is sent as the CGI data. Overwrite in your class.
          Contributed by Franz  Glasner.
          """
***************
*** 727,728 ****
--- 776,778 ----
          self.target = None
          self.buffer = []
+         BufferingHandler.close(self)




More information about the Python-checkins mailing list