我正在尝试为我的一些python模块创建一个中央日志记录系统。 我希望能够使用日志从多个模块发送消息,然后中央记录器接收它们并进行处理。
为简单起见,我希望我的模块A看起来像这样:
bus = connect_to_a_bus_that_is_always_there
while True:
#Publish a message to message bus, pseudo code
bus.publish(topic="logs.a", message="example")
time sleep(1)
和记录器(唯一的订户)
def actOnNewMessage(msg):
if msg.topic.subtopic == "a":
doSomethingForA(msg.data)
bus = connect_to_a_bus_that_is_always_there
bus.subscribe("logs", handler=actOnNewMessage)
while True:
#wait for messages
现在Logger模块就像一个库,所以它不会持续运行,所以也许我可以在Logger和Message Bus之间引入一些东西,这将会不断地收看新消息。
我看过PyPubSub,但似乎没有介绍文档中不同运行的python模块之间的持久通信。如果有人试过这个,如果我可以在不同的模块之间使用它,它对我有用。
另一个问题是我可能最终得到的模块不是用python编写的,所以我真的不想在模块A,B和Logger之间进行直接通信。 最后,我的架构可能看起来像这样:
我希望上面的信息不会混淆。
tl; dr :在python和a中使用持久性消息总线发布 - 订阅 不断等待新消息的订阅者。任何现成的解决方案?
编辑: 我正在考虑运行一个知道Logger模块的Web套接字服务器,其他模块A,B知道websocket的地址。这个设计有什么缺点吗?
答案 0 :(得分:1)
Opensplice是一种消息总线,允许持久,缓冲的数据通信。 不要滚动自己的消息总线!它们是复杂的野兽。
为什么不简单地使用syslog? syslog的某些版本也支持从多个节点到中央收集点的日志记录。许多编程语言都支持它,包括python。
我强烈建议您使用标准的python日志框架。它允许您使用各种标准记录器选择日志的位置,例如SyslogHandler,SocketHandler和DatagramHandler。
它甚至允许你编写自己的处理程序,如果你必须......
答案 1 :(得分:1)
我遇到过nanomsg。完全符合我的需求,具有MIT许可证,无需运行其他服务器。此外,还有我想使用的任何语言的绑定。
ping
from nanomsg import Socket, PUB
s = Socket(PUB)
s.connect('tcp://localhost:8080')
s.send('topicMessage')
答案 2 :(得分:0)
您可以将redis作为代理并在单独的进程中运行logger.py。
logger.py
import redis
r = redis.Redis()
while True:
next_log_item = r.blpop(['logs'], 0)
write_to_db(next_log_item)
a.py
import redis
import time
r = redis.Redis()
while True:
r.rpush('logs', message)
time.sleep(1)