فهرست منبع

Merge pull request #402 from magnus-lycka/master

Log rotation fails if current log was removed. Log lost until restart.
Mike Naberezny 11 سال پیش
والد
کامیت
e690e4f95a
2فایلهای تغییر یافته به همراه25 افزوده شده و 2 حذف شده
  1. 8 2
      supervisor/loggers.py
  2. 17 0
      supervisor/tests/test_loggers.py

+ 8 - 2
supervisor/loggers.py

@@ -190,10 +190,16 @@ class RotatingFileHandler(FileHandler):
             try:
                 os.remove(dfn)
             except OSError, why:
-                # catch race condition (already deleted)
+                # catch race condition (destination already deleted)
                 if why.args[0] != errno.ENOENT:
                     raise
-        os.rename(sfn, dfn)
+        try:
+            os.rename(sfn, dfn)
+        except OSError, why:
+            # catch exceptional condition (source deleted)
+            # E.g. cleanup script removes active log.
+            if why[0] != errno.ENOENT:
+                raise
 
     def doRollover(self):
         """

+ 17 - 0
supervisor/tests/test_loggers.py

@@ -177,6 +177,23 @@ class RotatingFileHandlerTests(FileHandlerTests):
         two = open(self.filename+ '.2','r').read()
         self.assertEqual(two, 'a'*12)
 
+    def test_current_logfile_removed(self):
+        handler = self._makeOne(self.filename, maxBytes=6, backupCount=1)
+        record = self._makeLogRecord('a' * 4)
+
+        handler.emit(record) # 4 bytes
+        self.assert_(os.path.exists(self.filename))
+        self.assertFalse(os.path.exists(self.filename + '.1'))
+
+        # Someone removes the active log file! :-(
+        os.unlink(self.filename)
+        self.assertFalse(os.path.exists(self.filename))
+
+        handler.emit(record) # 8 bytes, do rollover
+        self.assert_(os.path.exists(self.filename))
+        self.assertFalse(os.path.exists(self.filename + '.1'))
+
+
 class BoundIOTests(unittest.TestCase):
     def _getTargetClass(self):
         from supervisor.loggers import BoundIO