Celery

Logging

Mission: Log to syslog with a single logging config (logging.yaml):

version: 1
disable_existing_loggers: True

root:
  level: INFO
  handlers:
    - console
    - syslog

loggers:
  celery:
    level: INFO

handlers:
  console:
    class: logging.StreamHandler
    formatter: generic
    stream: ext://sys.stdout
  syslog:
    class: logging.handlers.SysLogHandler
    formatter: generic
    address: '/dev/log'

formatters:
  generic:
    format: '%(name)s[%(process)d] [%(levelname)s] [%(module)s:%(lineno)d] %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'

Tip with ‘/dev/log’ from http://stackoverflow.com/questions/6205254/how-to-setup-sysloghandler-with-django-1-3-logging-dictionary-configuration.

In Celery there are two different loggers:

  • global logger for the main daemon
  • task loggers

Global Logger

To configure the global logger:

import yaml
import logging.config
logging_config_dict = yaml.load(open('/etc/my-service/logging.yaml'))
logging.config.dictConfig(logging_config_dict)

Task Logger

Whereever you put your tasks:

from celery.utils.log import get_task_logger
log = get_task_logger(__name__)

@after_setup_task_logger.connect
def configure_task_logger(**kwargs):
    import yaml
    import logging.config
    logging_config_dict = yaml.load(open('/etc/service/logging.yaml'))
    logging.config.dictConfig(logging_config_dict)