具有进程间通信功能的服务器-客户端日志记录体系结构.你知道解决方案吗?



现在我有:

  • C++编写的多线程Windows服务,使用公共静态库和动态DLL;
  • 每个线程执行不同的任务并产生不同的错误(数据库错误、函数调用错误等(。每个线程将进一步充当logger client(并将所有消息发送到logger server(;
  • 一个单独的线程,它还没有正文,但它将充当处理来自logger clients的所有日志消息logger server

我需要关于如何将以下想法实施到工作解决方案中的好建议。这个想法是将服务器-客户端日志记录架构添加到我的多线程服务器中,具有以下要求(尽管有些部分我需要自己实现,但请考虑logger clientlogger server的基本思想(:

  1. 应该有很多log clients(正如我已经提到的,log client只是一个存在的工作线程(,每个都应该注册一个具有唯一名称或/和 ID 以及以下行为的实体

    • 如果logger server已启动并且现在正在工作,则此log client开始发送日志消息,

    • 否则(logger server关闭(,log client会无休止地尝试使用小超时向log server注册自己。

  2. 应该有一个logger server,具有以下行为:

    • log server 使用其唯一名称或/log clients ID 注册所有,并无休止地检查是否出现要注册的新日志客户端

    • 日志服务器处理来自不同log clients的所有消息,并写入数据库、文件等。

    • 应该有机会从外部应用程序建立log server的连接(例如,MySuperThreadViewerProgram 来监视所有线程活动/错误/等(。在连接时,log server将外部应用程序视为另一个log client这是最重要的要求。

综上所述,有三个架构部分需要实现

  1. 服务器-客户端记录器架构;
  2. log clientslog server之间的消息队列工具log server定期检查是否有任何可用的日志客户端要注册;
  3. log server和外部应用程序之间的进程间通信,后者充当新的log client

请注意,我认为logger server是一种日志消息路由器

所以,主要问题是:

是否有任何解决方案(软件框架(具有上述所有功能(最好(或者我应该为不同的部分使用不同的库?

如果答案是:"没有这样的解决方案",你能回顾一下我所做的选择吗:

  • 对于#1:使用Pantheios记录器框架;
  • 对于#2:使用具有服务器-客户端架构和消息队列支持的任何类型的注册-订阅库(更新:IPC库(;
  • 对于#3:使用Boost.Interprocess - 使用SharedMemory。

更新:

#2 的一个很好的例子是这个 ipc 库。也许我描述logger client - logger server关系有点不正确,但我真正的意思类似于方法,在 ipc 库中完全描述和实现:当一个实体(线程(订阅另一个实体(线程(以接收其消息(或"发布-订阅"模型(。我想使用一种这种技术来实现我的日志记录体系结构。但是以什么方式呢?


UPDATE2:

操作系统是Windows。是的,我知道,在Linux下有很多有用的工具和框架(D-Bus,Syslog(。也许你们中的一些人可以提供指向跨平台库的有用链接,这可能很有用?也许在Windows下有一个D-Bus上的记录器框架


任何评论都非常感谢。

多谢!

ØMQ (ZeroMQ( 可能是您提到的 ipc 库的可行替代方案,因为它具有许多符合您要求的功能。

它完全支持 PUB/SUB 模型,允许您在线程、bteween 进程之间甚至在机器之间工作。它是一个客户端-服务器架构,一个消息队列,也可以用作 IPC。

当然,您需要一种特定的方式来编码和解码消息,协议缓冲区确实是一个好主意。

据我所知,pantheios 使用的日志记录后端(即日志接收器:DB、文件或其他任何东西(是在链接时指定的。进入后端的日志的严重性可以在启动时指定,也可以在运行时进行一些简单的调整。

如果我猜对了,那么你有一个进程(让我们暂时忘记外部应用程序(有多个工作线程正在运行。其中一些线程应该记录到一个公共后端(例如.DB(,而另一些线程应该记录到另一个后端。由于 pantheios 无法开箱即用,因此您需要编写一个自定义后端,该后端可以将日志路由到正确的后端。

如果内存消耗不是问题,并且您不需要最快的日志记录性能,那么您可能需要查看 log4cxx,因为它是高度可配置的,并且可能使您免于实现客户端-服务器架构及其带来的所有同步问题。

关于外部应用程序:如果可以保证它只是一个外部客户端,则可以使用管道机制与服务通信。然后,服务进程将具有一个单独的线程,该线程对应于服务器线程,该线程打开命名管道,也可以指定为日志接收器,以便工作线程可以记录到该线程以及其他日志接收器(DB、文件等(。

也有一些系统日志服务器可以获胜。例如,Winsyslog来自著名的rsyslog的制作者。一旦你在win上运行syslogd,就会有很多独立于操作系统的系统日志客户端,例如如果你使用Java,则为SysLog4j,或者用于std.python日志记录的Syslog处理程序。

最新更新