2013-05-26 1 views
1

Я пытаюсь получить django celery для регистрации (для консоли) событий DEBUG (и выше), исходящих из моих модулей (а не из библиотек). Так, начиная с celeryd:Celery Python logging config to log DEBUG только из указанных модулей

python hack/manage.py celeryd -E -l DEBUG -c 2 

будет означать, что все DEBUG события передаются на консоль (которая является обработчиком на мой корневой регистратор). Я хотел бы изменить это поведение так, что:

  • DEBUG событие из MyModule (и дети) идут на консоль
  • DEBUG события от всех остальных модулей игнорируются (например: перейти к Null Handler)
  • все другие события обрабатываются в обычном режиме (например: ERROR продолжает работать с почтовым обработчиком)

Каков наилучший способ для этого?

ответ

3

Я обрезал это, и нет ни одного «наилучшего» способа сделать это. Важно иметь в виду несколько вещей.

  • Сельдерей работает на производстве как отдельный исполняемый файл. Это кажется очевидным, но это означает, что обмен файлами журналов с другими вещами (например, django) не будет работать хорошо (см. CELERYD_HIJACK_ROOT_LOGGER), поэтому не делайте этого.
  • Сохранение вещей, выполняющихся аналогичным образом как на производстве, так и на вашем развитии среда действительно критичен, то не спутываются при переходе к procution (См CELERY_ALWAYS_EAGER и использовать его)
  • сельдерея при запуске из manage.py будет ссылаться на файл settings.py для конфигурации, если использовать параметры

Имея это в виду, я хотел бы предложить вам настроить регистрацию в соответствии с вашими потребностями. Сначала убедитесь, что у вас установлен уровень ведения журнала для ваших модулей. См. Мой other post о том, как настроить ведение журнала. Ниже приведена конденсированная версия для удовлетворения ваших потребностей.

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'standard': { 
      'format': "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s", 
      'datefmt': "%d/%b/%Y %H:%M:%S" 
     }, 
    }, 
    'handlers': { 
     'console': { 
      'level': 'DEBUG', 
      '()': 'logutils.colorize.ColorizingStreamHandler', 
      'formatter': 'standard', 
      'stream': sys.stdout 
     }, 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'django.utils.log.AdminEmailHandler', 
      'include_html': True, 
     }, 

    }, 
    'loggers': { 
     'django': { 
      'handlers': ['mail_admins'], 
      'propagate': True, 
      'level': 'ERROR', 
     }, 
     'mymodule': { 
      'handlers': ['console', 'mail_admins'], 
      'propagate': True, 
      'level': 'DEBUG' 

     }, 
    } 
} 

Затем запустите его следующим образом.

./manage.py celeryd --event --beat --settings=dev 

Что это такое, он устанавливает два разных обработчика. Первый - это консольный обработчик, который сообщает что-нибудь DEBUG и выше. Второй - обработчик почты, который смотрит только на ОШИБКИ и выше. Далее сообщается о регистраторах. Все регистраторы django. * Получат сообщение любому обработчику уровня ERROR (mail_admins). И любой из наших модулей подталкивает DEBUG и выше к обоим.

Я думаю, что это то, что вам нужно.

+0

Привет - это не совсем то, что мне нужно. То, что я пытался настроить, - это конфигурация, в которой все вызовы DEBUG из журналов, находящихся в белом списке, отправляются на консоль, и все вызовы DEBUG из других модулей (например: библиотеки) игнорируются. Так, например: все вызовы DEBUG от регистраторов с именем «mymodule» (и все вспомогательные модули) будут захвачены, а любые другие вызовы DEBUG будут проигнорированы. Уровни выше DEBUG не будут затронуты. – Taras

+0

О, в этом случае просто измените регистратор с именем '' to 'mymodule'. Я обновил свой ответ – rh0dium