通过RabbitMQ集中管理Python和NodeJS日志
我有一个服务,使用的是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!")