芹菜 4.0.2 不登录文件



我在我的Django项目中使用Celery(celery==4.0.2(。问题是我无法让芹菜登录到该文件。我什么都试过了。唯一有效的方法是在命令中指定文件:

celery worker -A realestate_scanner -l info --purge --logfile=logs/celery.log

但问题是日志可能会变得非常大,所以我需要指定旋转记录器,我想在生产中运行工人并作为死魔。

realestate_scanner/realestate_scanner/芹菜.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'realestate_scanner.settings')
app = Celery('realestate_scanner')

app.config_from_object('django.conf:settings',)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

realestate_scanner/realestate_scanner/设置.py...

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',
'djmoney',
'storage',
'engineapp',
'presentation',
'import_export'
]

BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Bratislava'
CELERY_LOG_FILE = 'test.log' # Not working
worker_log_file = 'test.log' # Not working
worker_hijack_root_logger = False
LOGGING = { # Not working
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'simple': {
'format': '%(levelname)s %(message)s',
'datefmt': '%y %b %d, %H:%M:%S',
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'celery': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'logs/celery.log',
'formatter': 'simple',
'maxBytes': 1024 * 1024 * 100,  # 100 mb
},
'scrapy': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/scrapy.log'),
'formatter': 'simple'
}
},
'loggers': {
'celery': {
'handlers': ['celery',],
'level': 'INFO',
},
'scrapy': {
'handlers': ['scrapy'],
'level': 'INFO',
}
},
}
from logging.config import dictConfig
dictConfig(LOGGING)

你有什么建议吗?

编辑:

根据lapinkoira的回答,我已将此信号添加到celery.py文件中:

from __future__ import absolute_import
import os
import logging
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'realestate_scanner.settings')
app = Celery('realestate_scanner')

app.config_from_object('django.conf:settings',)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
import celery.signals
@celery.signals.setup_logging.connect
def on_celery_setup_logging(**kwargs):
logger = logging.getLogger('realestate_scanner.realestate_scanner.celery')
if not logger.handlers:
handler = logging.FileHandler('celery_test_log.log')
formatter = logging.Formatter(logging.BASIC_FORMAT)  # you may want to customize this.
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.propagate = False

信号可能有效,因为创建了celery_test_log.log文件,但输出再次转到芹菜控制台。

我可能没有得到我需要的记录器,但不知道如何获得它。

mmm 看起来像 celery 开发人员说,即使您禁用hijack_root_logger,Celery 仍将配置自己的记录器并忽略其他配置

他建议使用芹菜日志记录信号:

来源 https://github.com/celery/celery/issues/3428

import celery.signals
@celery.signals.setup_logging.connect
def on_celery_setup_logging(**kwargs):
pass

我找不到完整的答案,所以这是我的。

姜戈LOGGING设置:

LOGGING = {
...
'handlers': {
'celery.file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': "path/to/celery.log",
},
},
'loggers': {
'celery': {
'handlers': ['celery.file'],
'level': 'INFO',
},
},
}

我必须命名记录器celery才能正常工作。像myapp.celery这样的名字不起作用。

celery.py

import logging
import celery
...
@celery.signals.setup_logging.connect  
def setup_celery_logging(**kwargs):  
return logging.getLogger('celery')  

如果您想在出现错误时向管理员发送电子邮件之类的操作,只需像往常一样添加处理程序即可。

LOGGING = {
...
'loggers': {
'celery': {
'handlers': ['celery.file', 'mail_admins'],
'level': 'INFO',
},
},
}

最新更新