借助RabbitMQ,集中了Python和NodeJS的日志

时间:2014-05-02 13:49:59

标签: python logging rabbitmq pika

我使用NodeJS,RabbitMQ和Python工作者提供服务。 NodeJS代理使用MongoDB,Python工作者只与rabbitMQ服务器建立连接。

我希望能够在db中集中来自不同语言的所有日志。

我的想法是将所有日志推送到rabbitMQ队列中,然后将它们推送到NodeJS使用的mongoDB中。

我想知道这是否是集中日志的最佳方式,如何将日志记录python模块重定向到pika用户?

3 个答案:

答案 0 :(得分:2)

python' s Logbook library内置了RabbitMQHandler,因此您可以只使用它将工作日志重定向回RabbitMQ交换中而不必编写自己的内容

答案 1 :(得分:1)

这是我编写的用于RabbitMQ的自定义python日志记录处理程序。我继承了Handler类并重写了emit和close方法。我使用Kombu作为python库来访问RabbiMQ

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')

答案 2 :(得分:0)

听起来您想要创建自定义logging.Handler。您将覆盖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!")