通过RabbitMQ集中管理Python和NodeJS日志

1 投票
3 回答
3397 浏览
提问于 2025-04-18 05:08

我有一个服务,使用的是NodeJS、RabbitMQ和Python工作程序。NodeJS的部分使用MongoDB,而Python工作程序只连接到RabbitMQ服务器。

我想把不同语言的所有日志集中到一个数据库里。

我的想法是把所有日志推送到RabbitMQ的一个队列里,然后再把它们放到NodeJS使用的MongoDB里。

我想知道这样做是否是集中管理日志的最佳方法,以及如何把Python的日志模块重定向到pika消费者那里?

3 个回答

2

这是我写的一个自定义的Python日志处理器,用于RabbitMQ。我继承了Handler类,并重写了emit和close这两个方法。我使用了Kombu这个Python库来访问RabbitMQ。

import logging

class RabbitMQHandler(logging.Handler):
    """
     A handler that acts as a RabbitMQ publisher
     Requires the kombu module.

     Example setup::

        handler = RabbitMQHandler('amqp://guest:guest@localhost//', queue='my_log')
    """
    def __init__(self, uri=None, queue='logging'):
        logging.Handler.__init__(self)
        try:
            import kombu
        except ImportError:
            raise RuntimeError('The Kombu library is required for the RabbitMQSubscriber.')
        if uri:
            connection = kombu.Connection(uri)

        self.queue = connection.SimpleQueue(queue)

    def emit(self, record):
        self.queue.put(record.msg)

    def close(self):
        self.queue.close()

使用方法:

# our own logger
my_logger = logging.getLogger('teja_logger')
my_logger.setLevel(logging.DEBUG)

# rabbitmq handler
rabbitmq_handler = RabbitMQHandler('amqp://guest:guest@localhost:5672//', queue = 'log_q')

# adding rabbitmq handler
my_logger.addHandler(rabbitmq_handler)
my_logger.debug('hello')
3

Python的Logbook库里面有一个叫做RabbitMQHandler的功能。这样一来,你就不需要自己去写代码了,可以直接用这个功能把你的工作日志发送回RabbitMQ的交换机里。

0

听起来你想要创建一个自定义的 日志处理器。你需要重写 emit 方法,让它把日志信息发送到你选择的 RabbitMQ 队列中。同时,你还需要重写 close 方法,让它关闭 RabbitMQ 的通道或连接等等。

然后使用这个处理器时,可以像这样做(想了解更多信息,可以查看 https://docs.python.org/2/howto/logging.html):

import logging

# create logger
logger = logging.getLogger('my_logger')

# create RabbitMQ handler
rh = RabbitMQHandler()  # You need to create this.

# add rh to logger
logger.addHandler(rh)

# start logging stuff
logger.error("An error!")

撰写回答