我使用NodeJS,RabbitMQ和Python工作者提供服务。 NodeJS代理使用MongoDB,Python工作者只与rabbitMQ服务器建立连接。
我希望能够在db中集中来自不同语言的所有日志。
我的想法是将所有日志推送到rabbitMQ队列中,然后将它们推送到NodeJS使用的mongoDB中。
我想知道这是否是集中日志的最佳方式,如何将日志记录python模块重定向到pika用户?
答案 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!")