Преглед на файлове

Added CELERY_REDIRECT_STDOUTS + CELERYD_REDIRECT_STDOUTS_LEVEL settings.CELERY_REDIRECT_STDOUTS is used by celeryd and celerybeat, and if enabled all output to stdout and stderr will be redirected to the current logger.CELERY_REDIRECT_STDOUTS_LEVEL decides the loglevel used and is WARNING by default.

Ask Solem преди 14 години
родител
ревизия
fe91f0ba35
променени са 6 файла, в които са добавени 57 реда и са изтрити 12 реда
  1. 2 0
      celery/app/defaults.py
  2. 12 6
      celery/apps/beat.py
  3. 14 5
      celery/apps/worker.py
  4. 3 0
      celery/conf.py
  5. 3 0
      celery/log.py
  6. 23 1
      docs/configuration.rst

+ 2 - 0
celery/app/defaults.py

@@ -92,6 +92,8 @@ NAMESPACES = {
         "TASK_ERROR_WHITELIST": Option((), type="tuple"),
         "TASK_SERIALIZER": Option("pickle"),
         "TRACK_STARTED": Option(False, type="bool"),
+        "REDIRECT_STDOUTS": Option(True, type="bool"),
+        "REDIRECT_STDOUTS_LEVEL": Option("WARNING"),
     },
     "CELERYD": {
         "CONCURRENCY": Option(0, type="int"),

+ 12 - 6
celery/apps/beat.py

@@ -27,7 +27,8 @@ class Beat(object):
 
     def __init__(self, loglevel=None, logfile=None, schedule=None,
             max_interval=None, scheduler_cls=None, app=None,
-            socket_timeout=30, **kwargs):
+            socket_timeout=30, redirect_stdouts=None,
+            redirect_stdouts_level=None, **kwargs):
         """Starts the celerybeat task scheduler."""
         self.app = app = app_or_default(app)
 
@@ -38,13 +39,17 @@ class Beat(object):
         self.max_interval = max_interval
         self.socket_timeout = socket_timeout
         self.colored = term.colored(enabled=app.conf.CELERYD_LOG_COLOR)
+        self.redirect_stdouts = (redirect_stdouts or
+                                 app.conf.CELERY_REDIRECT_STDOUTS)
+        self.redirect_stdouts_level = (redirect_stdouts_level or
+                                       app.conf.CELERY_REDIRECT_STDOUTS_LEVEL)
 
         if not isinstance(self.loglevel, int):
             self.loglevel = LOG_LEVELS[self.loglevel.upper()]
 
     def run(self):
         logger = self.setup_logging()
-        print(str(self.colored.magenta(
+        print(str(self.colored.cyan(
                     "celerybeat v%s is starting." % __version__)))
         self.init_loader()
         self.set_process_title()
@@ -55,8 +60,9 @@ class Beat(object):
                                                        logfile=self.logfile)
         if not handled:
             logger = self.app.log.get_default_logger(name="celery.beat")
-            self.app.log.redirect_stdouts_to_logger(logger,
-                                                    loglevel=logging.WARNING)
+            if self.redirect_stdouts:
+                self.app.log.redirect_stdouts_to_logger(logger,
+                        loglevel=self.redirect_stdouts_level)
         return logger
 
     def start_scheduler(self, logger=None):
@@ -67,8 +73,8 @@ class Beat(object):
                             scheduler_cls=self.scheduler_cls,
                             schedule_filename=self.schedule)
 
-        print(str(c.blue("__    ", c.red("-"),
-                  c.blue("    ... __   "), c.red("-"),
+        print(str(c.blue("__    ", c.magenta("-"),
+                  c.blue("    ... __   "), c.magenta("-"),
                   c.blue("        _\n"),
                   c.reset(self.startup_info(beat)))))
         if self.socket_timeout:

+ 14 - 5
celery/apps/worker.py

@@ -11,6 +11,7 @@ from celery import signals
 from celery.app import app_or_default
 from celery.exceptions import ImproperlyConfigured
 from celery.utils import get_full_cls_name, LOG_LEVELS
+from celery.utils import term
 from celery.worker import WorkController
 
 
@@ -37,7 +38,8 @@ class Worker(object):
             hostname=None, discard=False, run_clockservice=False,
             schedule=None, task_time_limit=None, task_soft_time_limit=None,
             max_tasks_per_child=None, queues=None, events=False, db=None,
-            include=None, app=None, pidfile=None, **kwargs):
+            include=None, app=None, pidfile=None,
+            redirect_stdouts=None, redirect_stdouts_level=None, **kwargs):
         self.app = app = app_or_default(app)
         self.concurrency = (concurrency or
                             app.conf.CELERYD_CONCURRENCY or
@@ -55,12 +57,17 @@ class Worker(object):
                                      app.conf.CELERYD_TASK_SOFT_TIME_LIMIT)
         self.max_tasks_per_child = (max_tasks_per_child or
                                     app.conf.CELERYD_MAX_TASKS_PER_CHILD)
+        self.redirect_stdouts = (redirect_stdouts or
+                                 app.conf.CELERY_REDIRECT_STDOUTS)
+        self.redirect_stdouts_level = (redirect_stdouts_level or
+                                       app.conf.CELERY_REDIRECT_STDOUTS_LEVEL)
         self.db = db
         self.use_queues = queues or []
         self.queues = None
         self.include = include or []
         self.pidfile = pidfile
         self._isatty = sys.stdout.isatty()
+        self.colored = term.colored(enabled=defaults.CELERYD_LOG_COLOR)
 
         if isinstance(self.use_queues, basestring):
             self.use_queues = self.use_queues.split(",")
@@ -81,7 +88,8 @@ class Worker(object):
         self.init_queues()
         self.worker_init()
         self.redirect_stdouts_to_logger()
-        print("celery@%s v%s is starting." % (self.hostname, __version__))
+        print(str(self.colored.cyan(
+                "celery@%s v%s is starting." % (self.hostname, __version__))))
 
         if getattr(os, "geteuid", None) and os.geteuid() == 0:
             warnings.warn(
@@ -92,7 +100,7 @@ class Worker(object):
 
         # Dump configuration to screen so we have some basic information
         # for when users sends bug reports.
-        print(self.startup_info())
+        print(str(self.colored.reset(" \n", self.startup_info())))
         self.set_process_status("Running...")
 
         self.run_worker()
@@ -126,8 +134,9 @@ class Worker(object):
                                                        logfile=self.logfile)
         if not handled:
             logger = self.app.log.get_default_logger()
-            self.app.log.redirect_stdouts_to_logger(logger,
-                                                    loglevel=logging.WARNING)
+            if self.redirect_stdouts:
+                self.app.log.redirect_stdouts_to_logger(logger,
+                                loglevel=self.redirect_stdouts_level)
 
     def purge_messages(self):
         count = self.app.control.discard_all()

+ 3 - 0
celery/conf.py

@@ -22,6 +22,9 @@ IGNORE_RESULT = conf.CELERY_IGNORE_RESULT
 TRACK_STARTED = conf.CELERY_TRACK_STARTED
 ACKS_LATE = conf.CELERY_ACKS_LATE
 
+REDIRECT_STDOUTS = conf.CELERY_REDIRECT_STDOUTS
+REDIRECT_STDOUTS_LEVEL = conf.CELERY_REDIRECT_STDOUTS_LEVEL
+
 # <--- SQLAlchemy                                  <-   --   --- - ----- -- #
 
 RESULT_DBURI = conf.CELERY_RESULT_DBURI

+ 3 - 0
celery/log.py

@@ -9,6 +9,7 @@ from multiprocessing import util as mputil
 
 from celery import signals
 from celery.app import app_or_default
+from celery.utils import LOG_LEVELS
 from celery.utils.compat import LoggerAdapter
 from celery.utils.patch import ensure_process_aware_logger
 from celery.utils.term import colored
@@ -198,6 +199,8 @@ class LoggingProxy(object):
     def __init__(self, logger, loglevel=None):
         self.logger = logger
         self.loglevel = loglevel or self.logger.level or self.loglevel
+        if not isinstance(self.loglevel, int):
+            self.loglevel = LOG_LEVELS[self.loglevel.upper()]
         self._safewrap_handlers()
 
     def _safewrap_handlers(self):

+ 23 - 1
docs/configuration.rst

@@ -998,7 +998,7 @@ The default is :const:`None` (``stderr``)
 CELERYD_LOG_LEVEL
 ~~~~~~~~~~~~~~~~~
 
-Worker log level, can be any of :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
+Worker log level, can be one of :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
 :const:`ERROR` or :const:`CRITICAL`.
 
 Can also be set via the :option:`--loglevel` argument to
@@ -1034,6 +1034,28 @@ Default is::
 See the Python :mod:`logging` module for more information about log
 formats.
 
+.. setting:: CELERY_REDIRECT_STDOUTS
+
+CELERY_REDIRECT_STDOUTS
+~~~~~~~~~~~~~~~~~~~~~~~
+
+If enabled ``stdout`` and ``stderr`` will be redirected
+to the current logger.
+
+Enabled by default.
+Used by :program:`celeryd` and :program:`celerybeat`.
+
+.. setting:: CELERY_REDIRECT_STDOUTS_LEVEL
+
+CELERY_REDIRECT_STDOUTS_LEVEL
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The loglevel output to ``stdout`` and ``stderr`` is logged as.
+Can be one of :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
+:const:`ERROR` or :const:`CRITICAL`.
+
+Default is :const:`WARNING`.
+
 .. _conf-custom-components:
 
 Custom Component Classes (advanced)