2017-07-18 52 views
0

我在我的Django項目中使用Celery(celery == 4.0.2)。問題是我無法將Celery登錄到文件中。我已經嘗試了一切。其作品的唯一的事情就是在命令中指定的文件:CELERY 4.0.2不會登錄到文件

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

但問題是,日誌可以變得非常巨大的,所以我需要指定旋轉記錄儀,我想運行工人和跳動的守護程序生產。

realestate_scanner/realestate_scanner/celery.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/settings.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文件創建,但輸出爲芹菜控制檯再次。

我可能沒有得到我需要的記錄器,但不知道如何得到它。

+0

哪芹菜版你有嗎? – lapinkoira

+0

@lapinkoira芹菜== 4.0.2 –

+0

啊我沒有看到你已經發布了上面的版本,你是否與監督人一起守護這名工人? – lapinkoira

回答

1

嗯看起來像芹菜開發說,芹菜還是會配置它自己的記錄器,而忽略其他的配置,即使你禁用hijack_root_logger

他建議使用芹菜測井信號:

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

import celery.signals 

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

我明白這個信號,但我不知道該怎麼做,如何設置日誌記錄?謝謝 –

+0

你必須在信號內調用你的記錄器處理程序,就像在這個答案中一樣https://stackoverflow.com/questions/6192265/send-log-messages-from-all-celery-tasks-to-a-single-file – lapinkoira

+0

我檢查過它並試圖創建信號。但我無法弄清楚如何獲得正確的記錄器。我在問題的底部添加了我的代碼。 –