【问题标题】:How to send celery all logs to a custom handler . in my case python-logstash handler如何将 celery 所有日志发送到自定义处理程序。在我的情况下 python-logstash 处理程序
【发布时间】:2026-01-01 07:20:06
【问题描述】:

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

我想将它们都发送到自定义处理程序(在我的例子中是 python-logstash 处理程序)

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

【问题讨论】:

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


    【解决方案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 信号解决了问题

    【讨论】:

      【解决方案2】:

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

      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)
      

      微调 Celery 的记录器后,您可以简单地依靠它来将应用程序消息发送到 Logstash,即使您需要发送自己的消息:

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

      【讨论】: