Browse Source

Avoid 'no handlers for logger' warning

Ask Solem 13 years ago
parent
commit
2dd23f2b99
3 changed files with 23 additions and 10 deletions
  1. 8 3
      celery/app/log.py
  2. 7 2
      celery/tests/utils.py
  3. 8 5
      celery/utils/log.py

+ 8 - 3
celery/app/log.py

@@ -8,6 +8,7 @@ from celery import signals
 from celery.utils import isatty
 from celery.utils.compat import LoggerAdapter, WatchedFileHandler
 from celery.utils.log import (
+    get_logger, NullHandler,
     ColorFormatter, ensure_process_aware_logger,
     LoggingProxy, get_multiprocessing_logger,
     reset_multiprocessing_logger, mlevel
@@ -44,7 +45,7 @@ class Logging(object):
         return colored(enabled=self.supports_color(logfile))
 
     def get_task_logger(self, loglevel=None, name=None):
-        logger = logging.getLogger(name or "celery.task.default")
+        logger = get_logger(name or "celery.task.default")
         if loglevel is not None:
             logger.setLevel(mlevel(loglevel))
         return logger
@@ -115,7 +116,7 @@ class Logging(object):
         :keyword loglevel: Initial log level.
 
         """
-        logger = logging.getLogger(name)
+        logger = get_logger(name)
         if loglevel is not None:
             logger.setLevel(mlevel(loglevel))
         return logger
@@ -167,8 +168,12 @@ class Logging(object):
         return LoggerAdapter(logger, {"task_id": task_id,
                                       "task_name": task_name})
 
+    def _has_handler(self, logger):
+        return (logger.handlers and
+                    not isinstance(logger.handlers[0], NullHandler))
+
     def _is_configured(self, logger):
-        return logger.handlers and not getattr(
+        return self._has_handler(logger) and not getattr(
                 logger, "_rudimentary_setup", False)
 
     def redirect_stdouts_to_logger(self, logger, loglevel=None,

+ 7 - 2
celery/tests/utils.py

@@ -29,6 +29,7 @@ from nose import SkipTest
 from ..app import app_or_default
 from ..utils.compat import WhateverIO, LoggerAdapter
 from ..utils.functional import noop
+from ..utils.log import NullHandler
 
 from .compat import catch_warnings
 
@@ -207,10 +208,14 @@ class AppCase(Case):
         pass
 
 
+def filter_NullHandler(handlers):
+    return [h for h in handlers if not isinstance(h, NullHandler)]
+
+
 def get_handlers(logger):
     if isinstance(logger, LoggerAdapter):
-        return logger.logger.handlers
-    return logger.handlers
+        return filter_NullHandler(logger.logger.handlers)
+    return filter_NullHandler(logger.handlers)
 
 
 def set_handlers(logger, new_handlers):

+ 8 - 5
celery/utils/log.py

@@ -12,16 +12,14 @@ try:
 except ImportError:
     current_process = mputil = None  # noqa
 
+from kombu.log import get_logger, LOG_LEVELS, NullHandler
+
 from .encoding import safe_str, str_t
 from .term import colored
 
 _process_aware = False
 
-LOG_LEVELS = dict(logging._levelNames)
-LOG_LEVELS["FATAL"] = logging.FATAL
-LOG_LEVELS[logging.FATAL] = "FATAL"
-
-is_py3k = sys.version_info >= (3, 0)
+is_py3k = sys.version_info[0] == 3
 
 
 def mlevel(level):
@@ -30,6 +28,11 @@ def mlevel(level):
     return level
 
 
+# ensure loggers exists, to avoid 'no handler for' warnings.
+logger = get_logger("celery")
+mp_logger = get_logger("multiprocessing")
+
+
 class ColorFormatter(logging.Formatter):
     #: Loglevel -> Color mapping.
     COLORS = colored().names