现在我有:
- 用
C++
编写的多线程Windows服务,使用公共静态库和动态DLL; - 每个线程执行不同的任务并产生不同的错误(数据库错误、函数调用错误等(。每个线程将进一步充当
logger client
(并将所有消息发送到logger server
(; - 一个单独的线程,它还没有正文,但它将充当处理来自
logger clients
的所有日志消息的logger server
。
我需要关于如何将以下想法实施到工作解决方案中的好建议。这个想法是将服务器-客户端日志记录架构添加到我的多线程服务器中,具有以下要求(尽管有些部分我需要自己实现,但请考虑logger client
和logger server
的基本思想(:
-
应该有很多
log clients
(正如我已经提到的,log client
只是一个存在的工作线程(,每个都应该注册一个具有唯一名称或/和 ID 以及以下行为的实体:-
如果
logger server
已启动并且现在正在工作,则此log client
开始发送日志消息, -
否则(
logger server
关闭(,log client
会无休止地尝试使用小超时向log server
注册自己。
-
-
应该有一个
logger server
,具有以下行为:-
log server
使用其唯一名称或/log clients
ID 注册所有,并无休止地检查是否出现要注册的新日志客户端 -
日志服务器处理来自不同
log clients
的所有消息,并写入数据库、文件等。 -
应该有机会从外部应用程序建立与
log server
的连接(例如,MySuperThreadViewerProgram 来监视所有线程活动/错误/等(。在连接时,log server
应将外部应用程序视为另一个log client
。这是最重要的要求。
-
综上所述,有三个架构部分需要实现:
- 服务器-客户端记录器架构;
log clients
和log server
之间的消息队列工具。log server
定期检查是否有任何可用的日志客户端要注册;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处理程序。