Bladeren bron

LoggerWrapper: Try to detect loggers logging back to stderr/stdout and avoid stack overflow

Ask Solem 14 jaren geleden
bovenliggende
commit
f7a01a4da6
1 gewijzigde bestanden met toevoegingen van 9 en 1 verwijderingen
  1. 9 1
      celery/log.py

+ 9 - 1
celery/log.py

@@ -174,6 +174,7 @@ class LoggingProxy(object):
     name = None
     name = None
     closed = False
     closed = False
     loglevel = logging.ERROR
     loglevel = logging.ERROR
+    _recurse_protection = False
 
 
     def __init__(self, logger, loglevel=None):
     def __init__(self, logger, loglevel=None):
         self.logger = logger
         self.logger = logger
@@ -207,10 +208,17 @@ class LoggingProxy(object):
         return map(wrap_handler, self.logger.handlers)
         return map(wrap_handler, self.logger.handlers)
 
 
     def write(self, data):
     def write(self, data):
+        if self._recurse_protection:
+            # Logger is logging back to this file, so stop recursing.
+            return
         """Write message to logging object."""
         """Write message to logging object."""
         data = data.strip()
         data = data.strip()
         if data and not self.closed:
         if data and not self.closed:
-            self.logger.log(self.loglevel, data)
+            self._recurse_protection = True
+            try:
+                self.logger.log(self.loglevel, data)
+            finally:
+                self._recurse_protection = False
 
 
     def writelines(self, sequence):
     def writelines(self, sequence):
         """``writelines(sequence_of_strings) -> None``.
         """``writelines(sequence_of_strings) -> None``.