rabbitmq Python自定义日志记录处理程序尝试在emit()期间记录自身

lyr7nygr  于 7个月前  发布在  RabbitMQ
关注(0)|答案(1)|浏览(74)

我正在尝试实现一个自定义日志处理程序,它应该发布到rabbitmq server1。
这个的基本设置看起来像这样:

class RabbitMQHandler(logging.Handler):

    def __init__(self, host: str, port: int, queue: str,  level: int = 0) -> None:
        self.host = host
        self.port = port
        self.queue = queue

        super().__init__(level)

    def emit(self, record: logging.LogRecord) -> None:
        try:
            msg = self.format(record)
            with pika.BlockingConnection(pika.ConnectionParameters(
                host=self.host,
                port=self.port
            )) as connection:
                channel = connection.channel()
                channel.queue_declare(queue=self.queue)
                channel.basic_publish(
                    exchange='',
                    routing_key=self.queue,
                    body=msg
                )
            self.flush()
        except (KeyboardInterrupt, SystemExit):
            raise
        except Exception:
            self.handleError(record)

字符串
这里的问题似乎是,pika模块试图在建立连接后立即记录自己,因此永远递归地调用emit()函数。
我的问题是,是否应该在发出函数期间简单地禁用日志记录(如何禁用?),或者这是完全错误的方法?

**编辑:**将上面的处理程序放入一个单独的记录器是一种方法,但是我想知道这个问题的一般解决方案。

1我知道有pip packages,但对于这个项目,我必须尽可能避免依赖。

rsaldnfx

rsaldnfx1#

这是因为您将自定义日志记录处理程序添加到根日志记录器,默认情况下日志记录消息会传播到祖先日志记录器,因此pika记录的消息会传播到根日志记录器,并递归调用自定义日志记录处理程序。
这种情况下的最佳实践是将自定义日志记录处理程序添加到非根日志记录器示例中,并使用该日志记录器来满足应用程序的日志记录需求。

相关问题