如何将芹菜所有日志发送到自定义处理程序。在我的情况下python-logstash处理程序

时间:2016-09-01 07:31:13

标签: python logging logstash django-celery celery-task

在我的Celery应用程序中,我在控制台上获得了两种类型的日志,即celery应用程序日志和任务级别日志(内部任务我使用logger.INFO(str)语法进行日志记录)

我想将它们发送到自定义处理程序(在我的情况下是python-logstash处理程序)

对于django日志我是成功的,通过在settings.py中设置处理程序和记录器,但我对芹菜无能为力

2 个答案:

答案 0 :(得分:1)

def initialize_logstash(logger=None,loglevel=logging.DEBUG, **kwargs):
    # logger = logging.getLogger('celery')
    handler = logstash.TCPLogstashHandler('localhost', 5959,tags=['worker'])
    handler.setLevel(loglevel)
    logger.addHandler(handler)
    # logger.setLevel(logging.DEBUG)
    return logger

from celery.signals import after_setup_task_logger
after_setup_task_logger.connect(initialize_logstash)
from celery.signals import after_setup_logger
after_setup_logger.connect(initialize_logstash)

同时使用after_setup_task_logger和after_setup_logger信号解决了问题

答案 1 :(得分:0)

Celery提供一个after_setup_logger信号,该信号在Celery设置记录器后触发。除其他几个参数外,信号还会传递记录器对象,您可以在其中添加自定义记录处理程序。

from celery import signals

import logstash
import logging


@signals.after_setup_logger.connect
def setup_logstash_logger(logger, *args, **kwargs):
    handler = logstash.TCPLogstashHandler('localhost', 5959)

    # More logger/handler configuration
    # handler.setLevel(logging.ERROR)
    # ...

    logger.addHandler(handler)

微调芹菜的记录器后,即使您需要发送自己的消息,您也可以仅依靠它将应用程序消息发送到Logstash:

logger = logging.getLogger(__name__)
logger.info('My message')  # This message will also be sent to Logstash