Предположим, конечная точка в проекте django
def my_view(request, my_id):
if is_request_valid(request):
logger = logging.getLogger('celery.task')
logger.info('Starting a task for a thing with ID %i', my_id)
my_cool_task.apply_async()
Теперь, согласно документации по сельдерею это может войти в систему, так как
Доступен специальный регистратор с именем «celery.task», который вы можете наследовать от этого регистратора, чтобы автоматически получать имя задачи и уникальный идентификатор как часть журналов.
Но регистратор «celery.task» работает только внутри задачи. Таким образом, в представлении этот журнал пойдет в никуда.
Кроме того, я поигрался с настройкой некоторой переменной журнала внутри settings.py, а затем переназначил журналирование сельдерея. Поигрался с CELERY_WORKER_HIJACK_ROOT_LOGGER, но даже когда я использую корневой регистратор, логи не появляются в консоли. Ни использование getLogger("сельдерей") не помогает.
Кажется, это простая вещь, но я целый день пытаюсь это сделать, пожалуйста, помогите.
UPD: Видела пост на реддите с той же проблемой, но ответов нет
Итак, по существу вопроса, взломать регистратор сельдерея невозможно.
Однако есть несколько обходных путей:
from celery.utils.log import get_task_logger
@shared_task
def log_stuff(level, message, *args, **kwargs):
get_task_logger().log(level, message, *args, **kwargs)
Однако это грязно по многим причинам: главным образом потому, что ваш журнал будет выполнен, когда к нему доберется рабочий, и это просто превратится в беспорядок.
LOGGING
, например:LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '[%(levelname)s] %(message)s',
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
'level': 'INFO',
# with rotating handlers you can configure max size and other stuff
'class': 'logging.FileHandler',
'formatter': 'simple',
'filename': 'my_log.log',
},
# that's the most interesting part
'loggers':
'django': {
'handlers': ['file', 'console'],
'level': 'INFO',
},
'celery': {
'handlers': ['file', 'console'],
'level': 'INFO',
},
}
Примечание. Конфигурация ведения журнала должна быть более сложной.
Теперь никаких дальнейших действий не требуется, учитывая настройку django celery по умолчанию из документации, и что ваша версия django — 4.2.11, а celery — 5.3.6 — в более старых версиях вы можете поиграть с сельдереем. сигналы.setup_logging.
Второе примечание: потоки настроены для отдельных процессов django и celery: вы не увидите их все в одном месте.
Наконец, конечно, это может работать с чем угодно, не обязательно только с Джанго.