2017-07-18 6 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) 

何かアドバイスはありますか?

EDIT:

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 celery == 4.0.2 –

+0

ああ、あなたは既に上記のバージョンを投稿しているのを見たことがありません、あなたは上司と労働者をデモンストレーションしますか? – lapinkoira

答えて

1

セロリdevのはセロリはまだそれが自分のロガーだ設定し、

をhijack_root_logger無効にしても彼はセロリのログ信号を使用することをお勧めします他の設定を無視すると言うようMMMに見える:

ソース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

私はそれをチェックし、信号を作成しようとしました。しかし、私は正しいロガーを取得する方法を把握することはできません。質問の最後にコードを追加しました。 –

関連する問題