1

现在我有:

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

我需要一个很好的建议,说明我应该如何将以下想法实施到一个可行的解决方案中。这个想法是为我的多线程服务器添加一个服务器-客户端日志架构,具有以下要求(尽管某些部分我需要自己实现,请仅考虑 and 的基本思想logger clientlogger server

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

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

    • 否则(logger server关闭),log client无休止地尝试log server使用一个小的超时来注册自己。

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

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

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

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

总结起来,要实现三个架构部分

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

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

所以,主要问题是:

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

如果答案是:“没有这样的解决方案”,您能否回顾一下我所做的选择:

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

更新:

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


更新2:

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


任何意见都受到高度赞赏。

非常感谢!

4

3 回答 3

1

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

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

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

于 2012-05-25T09:24:56.380 回答
0

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

如果我说得对,那么您有一个进程(让我们暂时忘记外部应用程序)运行多个工作线程。其中一些线程应该记录到一个共同的后端(例如数据库),一些到另一个。因为 pantheios 不能开箱即用,您需要编写一个自定义后端,可以将日志路由到正确的后端。

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

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

于 2012-05-23T09:25:51.453 回答
0

也有一些 syslog 服务器供 win 使用。例如,Winsyslog 来自著名的 rsyslog 的生产者。一旦你在 win 上运行了 syslogd,就会有很多独立于操作系统的 syslog 客户端,例如 SysLog4j(如果你使用 Java),或者 Syslog 处理程序用于 std。蟒蛇日志记录。

于 2013-10-09T05:59:25.940 回答