芹菜记录器配置



我正在使用Django 1.10,python 3.5和celery 4.1.0 我正在尝试将芹菜任务信息记录到文件中。所以我按照芹菜文档中的建议尝试了 -

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

并尝试在任务中记录一条消息 -

logger.info(message)

我希望它记录到我的默认记录器。但事实并非如此。所以我在设置中添加了一个名为"celery.task"的专用记录器(正如我从文档中了解到的那样):

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
'require_test_false': {
'()': 'myapp.utils.classes.logging.RequireTestFalse',
},
'suppress_deprecated': {
'()': 'myapp.utils.classes.logging.SuppressDeprecated'
}
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'json',
'filters': ['suppress_deprecated']
},
'celery_file': {
'level': 'INFO',
'class': 'myapp.utils.classes.logging.SBRotatingFileHandler',
'maxBytes': 1024 * 1024 * 200,  # 200 MB
'backupCount': 10,
'formatter': 'json',
'filename': BASE_DIR + '/../log/celery.log',
}
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
'propagate': True,
},
'celery.task': {
'handlers': ['console', 'celery_file'],
'level': 'INFO',
'propagate': True,
},
}

但是我仍然没有看到来自芹菜任务的日志,不在芹菜.log文件中,也不在默认日志文件中。

仅当使用"-f"启动芹菜工作时 - 它将日志写入该文件 有什么想法吗?

编辑: 我正在尝试使用"after_setup_task_logger"来更新 celery.task logger 处理程序以使用存在于我的 logging.config(在设置中)中的处理程序,但未成功。 我尝试了以下方法:

@celery.signals.after_setup_task_logger.connect
def after_setup_logging(logger, **kwargs):
logging_settings = settings.LOGGING
celery_handler = logging_settings['handlers']['celery_file']
logger.addHandler(celery_handler)

但这行不通。我得到了

AttributeError: 'dict' object has no attribute 'createLock'

这意味着未正确创建处理程序。 所以我尝试从"日志记录"对象中获取处理程序。但我在logging._handlers和logging._handlersList中都没有看到我的处理程序

更新: 这就是最终对我有用的:

def create_celery_logger_handler(logger, propagate):
# 209715200 is 1024 * 1024 * 200 or 200 MB, same as in settings
celery_handler = RotatingFileHandler(
settings.CELERY_LOG_FILE,
maxBytes=209715200,
backupCount=10
)
celery_formatter = jsonlogger.JsonFormatter(settings.LOGGING['formatters']['json']['format'])
celery_handler.setFormatter(celery_formatter)
logger.addHandler(celery_handler)
logger.logLevel = settings.LOG_LEVEL
logger.propagate = propagate

@celery.signals.after_setup_task_logger.connect
def after_setup_celery_task_logger(logger, **kwargs):
""" This function sets the 'celery.task' logger handler and formatter """
create_celery_logger_handler(logger, True)

@celery.signals.after_setup_logger.connect
def after_setup_celery_logger(logger, **kwargs):
""" This function sets the 'celery' logger handler and formatter """
create_celery_logger_handler(logger, False)

值得一提的是,这就是我配置芹菜以使用我的 Django 日志记录设置的方式:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.signals import setup_logging
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
app = Celery('app')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
@setup_logging.connect
def config_loggers(*args, **kwags):
from logging.config import dictConfig
from django.conf import settings
dictConfig(settings.LOGGING)
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

仅此而已 - 更改后,我的 django 日志记录设置适用于芹菜,包括我设置为将日志消息发送到 slack 的日志记录。

默认情况下,芹菜将在celery.task记录器上重置手柄,您可以使用worker_hijack_root_logger选项禁用此行为。或者,您可以在after_setup_task_logger信号中重新配置此记录器,甚至不要让芹菜使用setup_logging信号配置记录器:

from celery.signals import setup_logging
@setup_logging.connect()
def config_loggers(*args, **kwargs):
from logging.config import dictConfig
dictConfig(app.config['LOGGING_CONFIG'])

今天早上我正在摆弄我的日志,试图弄清楚为什么我的日志没有发布到根记录器,结果正如@georgexsh所说,celey 正在劫持根记录器,这是我的工作记录器配置:

'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'cal': {
'handlers': ['general'],
'level': 'INFO',
'propagate': True,
},
'': {
'handlers': ['gelf'],
'level': 'INFO',
}
}

并在设置中CELERYD_HIJACK_ROOT_LOGGER = False

所有的芹菜日志现在都去灰日志(在根中定义)而不是通常的位置。

相关内容

  • 没有找到相关文章

最新更新