【发布时间】:2018-06-25 16:00:34
【问题描述】:
我正在使用 Django 1.10、python 3.5 和 celery 4.1.0 我正在尝试将芹菜任务信息记录到文件中。所以我按照 celery 文档中的建议进行了尝试-
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,
},
}
但我仍然没有在 celery.log 文件和默认日志文件中看到来自 celery 任务的日志。
仅当使用 '-f' 启动 celery worker 时 - 它会将日志写入该文件 有什么想法吗?
编辑: 我正在尝试使用 'after_setup_task_logger' 更新 celery.task 记录器处理程序以使用我的 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)
【问题讨论】:
-
最后我混合了一些建议
-
好!除了我能做些什么来改进我的答案以使其被接受?
标签: python django logging celery