Update of /cvs-repository/Packages/zLOG
In directory cvs.zope.org:/tmp/cvs-serv16249

Modified Files:
      Tag: Zope-2_7-branch
        LogHandlers.py 
Log Message:

* Implement a file handler with 'rotate'.  This closes the file, attempts
  a rename to {filename}.last, then reopens the original name.  This
  then makes the log available for another process to perform the rotation
  logic on. This log handler is only installed on the Windows
  platform, where you can't rename an open file.


=== Packages/zLOG/LogHandlers.py 1.6.14.2 => 1.6.14.3 ===
--- Packages/zLOG/LogHandlers.py:1.6.14.2       Thu Oct  2 16:25:53 2003
+++ Packages/zLOG/LogHandlers.py        Tue Apr 12 22:59:36 2005
@@ -13,11 +13,13 @@
 """Handlers which can plug into a PEP 282 logger."""
 
 import sys
+import os
 
 from logging import Handler, StreamHandler
 from logging.handlers import SysLogHandler
 from logging.handlers import HTTPHandler, SMTPHandler
 from logging.handlers import NTEventLogHandler as Win32EventLogHandler
+import zLOG
 
 class FileHandler(StreamHandler):
     """
@@ -35,6 +37,42 @@
     def reopen(self):
         self.close()
         self.stream = open(self.baseFilename, self.mode)
+
+class Win32FileHandler(FileHandler):
+    """File-based log handler for Windows that supports an additional 'rotate'
+    method.  reopen() is generally useless since Windows cannot do a move on
+    an open file.
+    """
+    def rotate(self, rotateFilename=None):
+        if not rotateFilename:
+            rotateFilename = self.baseFilename + ".last"
+        error = None
+        self.close()
+        try:
+            os.rename(self.baseFilename, rotateFilename)
+        except OSError, error:
+            # logger cannot be used until we get a file handle again, so we
+            # store it in 'error'
+            pass
+
+        self.stream = open(self.baseFilename, self.mode)
+
+        if error:
+            # Note we *expect* to see a "file exists" error if some external 
+            # process has not cleaned up these logs.  For now, that just gets
+            # logged like any other error.
+            zLOG.LOG("Win32FileLogger", zLOG.ERROR,
+                     "File rotation error moving '%s' to '%s':" %
+                               (self.baseFilename, rotateFilename), error)
+        else:
+            zLOG.LOG("Win32FileLogger", zLOG.INFO,
+                     "File rotation moved '%s' to '%s'" %
+                               (self.baseFilename, rotateFilename))
+
+if os.name == "nt":
+    # Make it the default for Windows - we install a 'reopen' handler that
+    # tries to rotate the logfile.
+    FileHandler = Win32FileHandler
 
 class NullHandler(Handler):
     """

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
http://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to