Django Celery任务日志记录

12
我在工作中的Django项目中设置了Celery。我想将celery任务的日志与其他celery日志(如celerycam,celerybeat等)分开记录。
根据Celery文档(http://docs.celeryproject.org/en/latest/userguide/tasks.html#logging),我应该只需为“celery.task”定义一个Django记录器即可实现此目的。但是,当我这样做时,日志中没有任何内容显示。如果我创建一个通用的“celery”记录器,则所有内容都会显示出来,这意味着这可能与记录器的名称有关。
我错过了什么?有没有办法使其工作,还是所有的celery日志都必须放在一起?
值得一提的是,我设置了CELERYD_HIJACK_ROOT_LOGGER = False。
我的settings.py中的日志设置:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'formatters': {
        'standard': {
            'format': '%(asctime)s %(levelname)s [%(name)s: %(lineno)s] -- %(message)s',
            'datefmt': '%m-%d-%Y %H:%M:%S'
        },
    },
    'handlers': {
        'logfile': {
            'level': 'INFO',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/vagrant/logs/logfile.log',
            'maxBytes': 1024*1024*5,
            'backupCount': 3,
            'formatter': 'standard'
        },
        'debug_logfile': {
            'level': 'DEBUG',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/vagrant/logs/debug_logfile.log',
            'maxBytes': 1024*1024*5,
            'backupCount': 5,
            'formatter': 'standard'
        },
        'default_logger': {
            'level': 'WARNING',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/vagrant/logs/default.log',
            'maxBytes': 1024*1024*5,
            'backupCount': 2,
            'formatter': 'standard'
        },
        'celery_logger': {
            'level': 'DEBUG',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/vagrant/logs/celery.log',
            'maxBytes': 1024*1024*5,
            'backupCount': 2,
            'formatter': 'standard'
        },
        'celery_task_logger': {
            'level': 'DEBUG',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/vagrant/logs/celery_tasks.log',
            'maxBytes': 1024*1024*5,
            'backupCount': 2,
            'formatter': 'standard'
        },
    },
    'loggers': {
        '': {
            'handlers': ['default_logger'],
            'level': 'WARNING',
            'propagate': True,
        },
        'django': {
            'handlers': ['logfile'],
            'level': 'INFO',
            'propagate': True,
        },
        'feedmanager': {
            'handlers': ['logfile', 'debug_logfile'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'recipemanager': {
            'handlers': ['logfile', 'debug_logfile'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'menumanager': {
            'handlers': ['logfile', 'debug_logfile'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'celery.task': {
            'handlers': ['celery_task_logger'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'celery': {
            'handlers': ['celery_logger'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

celery.tasks 或 celery.task - toad013
1
谢谢 - 不太明白。我有一个用于 celery.task 的记录器,并尝试使用 celery.tasks 也达到了同样的效果。 - aravenel
1个回答

24
我猜想在你的任务中,你正在做这件事。
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

如果你这样做,那么你的日志记录器名称将是模块名称,所以如果你的任务在名为MyApp的应用程序中的tasks.py文件中,你的日志记录器将被命名为'MyApp.tasks',并且你需要在设置中创建日志记录器'MyApp.tasks'。

如果你想让所有任务都记录到同一个日志记录器中,只需在所有任务的__name__位置放置不同的字符串即可。例如:'celery.task'

还要确保你的worker loglevel是你想要的。


1
几乎可以确定就是这样了,谢谢!一到工作岗位就会尝试。出于好奇,为什么主要的“celery”记录器仍然会捕获这些任务日志呢? - aravenel
1
没错,我可以确认这个有效,谢谢!我仍然不明白为什么主要的“celery”记录器会捕捉到它们,但我可以接受这一点。 - aravenel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接