標準出力を Celery の別のロガーにリダイレクトできません。特別な Handler を使用して、Celery 用の特別なロガー オブジェクトを作成しました。そして、タスクが実行されたときに発生したすべての例外をキャッチしたい。独自のロガーをインストールするために、セロリに setup_logging シグナルのハンドラーを追加します。
import sys
import logging.config
from pika.adapters import BlockingConnection
from pika.connection import ConnectionParameters
from pika import BasicProperties
from celery.signals import setup_logging, after_setup_logger
class RabbitMqHandler(logging.Handler):
'''
Special logging handler which stores log messages in RabbitMq server
It can used for async delivering message to clients
'''
HOST = 'localhost'
QUEUE = 'hermes.standard'
def emit(self, record):
con = BlockingConnection(ConnectionParameters(self.HOST))
# Open the channel
channel = con.channel()
# Declare the queue
channel.queue_declare(queue=self.QUEUE, durable=True,
exclusive=False, auto_delete=False)
channel.basic_publish(exchange='', routing_key=self.QUEUE, body=self.format(record)) #','.join(dir(record)))
con.close()
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
'timed': {
'format': '[%(asctime)s: %(levelname)s] %(message)s'
},
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'timed'
},
'rabbit': {
'level': 'INFO',
'class': 'logconfig.RabbitMqHandler',
'formatter': 'timed'
},
'celery': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': '1.log',
'formatter': 'timed',
}
},
'loggers': {
'celery': {
'handlers': ['celery'],
'level': 'INFO',
},
'hermes': {
'handlers': ['console', 'rabbit'],
'level': 'INFO',
}
}
}
from celery.log import LoggingProxy
@setup_logging.connect
def setup_logconfig(**kwargs):
logging.config.dictConfig(LOGGING)
#return logging.getLogger('hermes')
「hermes」という名前の私自身のロガーは正常に動作しますが、すべての例外が発生し、標準的なセロリのロガー名 = セロリをキャッチします。設定でオーバーライドしようとしました:
CELERY_REDIRECT_STDOUTS =偽
しかし、それも機能しません。すべての例外は、標準のセロリ ロガーに送られます。