无法让芹菜像 Django 那样做 INFO 日志记录



我的日志记录配置如下:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'INFO',
            'class': 'common.handlers.SuperAdminEmailHandler'
            },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler'
            }
        },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['console'],
            'level': 'ERROR',
            'propagate': True,
            },
        },
    }

这是CELERYD_HIJACK_ROOT_LOGGER = False。我还有这个任务:

@periodic_task(run_every=crontab())
def test_logging():
    import logging
    print('running test_logging')
    logging.info("Here's an info message", extra = {
        'tell_admins': True, 'email_content': 'Additional content'
    })
    logging.error("Here's an error message")

我有一个直接调用test_logging的测试URL。当我点击该URL时,我会看到以下输出:

running test_logging
Here's an info message
Here's an error message
[05/Jul/2013 11:07:27] "GET /test/ HTTP/1.1" 200 7

正是我所期望的。当同样的函数在芹菜中运行时,我得到:

Scheduler: Sending due task scheduler.tasks.test_logging (scheduler.tasks.test_logging)
running test_logging
Here's an error message

信息信息去了哪里?!我尝试添加另一个芹菜专用记录器:

    'celery': {
        'handlers': ['console'],
        'level': 'INFO',
        'propagate': True,
        },

现在我从芹菜上看到了这个:

running test_logging
running test_logging
Here's an error message
Task scheduler.tasks.test_logging[271b8a4a-0c04-4391-81c5-5b009d70b08d] succeeded in 0.00929498672485s: None

仍然没有信息消息。你有没有想过为什么以及如何找回它?

由于某些原因,即使Celery使用您在Django的日志设置中指定的then处理程序,它仍然会覆盖日志程序的级别。我现在使用这个函数来获取一个记录器。将记录器设置到适当的级别后,一切似乎都如预期的那样工作。

import logging
from celery.utils.log import get_task_logger
def get_celery_logger(name):
    logger = get_task_logger(name)
    logger.level = logging.INFO
    return logger

首先,如果您使用django-celery,您可以尝试按如下方式运行:

/manage.py celeryd--loglevel=info

其次,如果您使用Celery>=3.0,则必须将记录器对象获取为:

from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)
# and inside your function use
# logger instead logging
@periodic_task(run_every=crontab())
def test_logging():
    print('running test_logging')
    logger.info("Here's an info message", extra = {
        'tell_admins': True, 'email_content': 'Additional content'
    })
    logger.error("Here's an error message")

如果不起作用,您也可以尝试更改LOGGIN对象

最新更新