4

我正在尝试为我的一些 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 中使用持久消息总线和不断等待新消息的订阅者发布-订阅。有现成的解决方案吗?

编辑:我正在考虑运行一个知道 Logger 模块的 Web 套接字服务器,而其他模块 A、B 知道 websocket 的地址。这种设计有什么缺点吗?

4

3 回答 3

1

Opensplice 是一种消息总线,允许持久的缓冲数据通信。不要滚动你自己的消息总线!他们是复杂的野兽。

为什么不简单地使用 syslog?有些版本的 syslog 还支持从多个节点记录到中央收集点。许多编程语言都支持它,包括 python。

强烈建议您使用标准的 python 日志框架。它允许您使用各种标准记录器(例如 SyslogHandler、SocketHandler 和 DatagramHandler)来选择日志的去向。

它甚至允许您编写自己的处理程序,如果您必须...

于 2015-08-06T14:16:37.320 回答
1

我遇到了nanomsg。完全符合我的需求,具有 MIT 许可证,无需运行额外的服务器。此外,还有我想使用的任何语言的绑定。

from nanomsg import Socket, PUB

s = Socket(PUB)
s.connect('tcp://localhost:8080')
s.send('topicMessage')

from nanomsg import Socket, SUB

s = Socket(SUB)
s.connect('tcp://localhost:8080')
s.set_string_option(SUB, SUB_SUBSCRIBE, "topic")
while True:
    print(s.recv())
于 2015-08-13T10:59:27.607 回答
0

您可以将 redis 作为代理并在单独的进程中运行 logger.py。

记录器.py

import redis

r = redis.Redis()

while True:
    next_log_item = r.blpop(['logs'], 0)
    write_to_db(next_log_item)

一个.py

import redis
import time

r = redis.Redis()

while True:
    r.rpush('logs', message)
    time.sleep(1)
于 2015-08-06T13:07:50.123 回答