Browse Source

There seems to a bug in multiprocessing (backport?) when detached, where the worker gets EOFErrors from time to time and the logger is left from the parent process causing a crash.

Ask Solem 15 years ago
parent
commit
8e2c44de37
2 changed files with 10 additions and 1 deletions
  1. 3 1
      celery/log.py
  2. 7 0
      celery/worker/__init__.py

+ 3 - 1
celery/log.py

@@ -35,9 +35,10 @@ def setup_logger(loglevel=conf.CELERYD_LOG_LEVEL, logfile=None,
         _monkeypatched[0] = True
 
     logger = get_default_logger(loglevel=loglevel)
-    if logger.handlers:
+    if getattr(logger, "_configured", False):
         # Logger already configured
         return logger
+    logger.handlers = []
     if logfile:
         handler = logging.FileHandler
         if hasattr(logfile, "write"):
@@ -49,6 +50,7 @@ def setup_logger(loglevel=conf.CELERYD_LOG_LEVEL, logfile=None,
     else:
         from multiprocessing.util import log_to_stderr
         log_to_stderr()
+    logger._configured = True
     return logger
 
 

+ 7 - 0
celery/worker/__init__.py

@@ -22,6 +22,13 @@ from celery.worker.controllers import Mediator, ScheduleController
 
 
 def process_initializer():
+    # There seems to a bug in multiprocessing (backport?)
+    # when detached, where the worker gets EOFErrors from time to time
+    # and the logger is left from the parent process causing a crash.
+    from logging import Logger
+    from multiprocessing import util as mputil
+    Logger.manager.loggerDict.clear()
+    mputil._logger = None
     platform.set_mp_process_title("celeryd")