POCO C ++:你有多个日志记录层次结构吗?

时间:2013-08-14 19:15:42

标签: c++ logging poco-libraries

我正在寻找使用POCO C ++库的独特日志记录解决方案。

我将尝试解释我们的设计和我们面临的问题。

我们有一个TCPServerConnectionFactory,它为每个新连接产生一个新环境(新的一组对象)。生成的环境获得一个新的套接字,并有一个监听线程。如果消息进入已建立的连接,则pthread将处理该消息。每个有用的消息都将包含一个标识符,该标识符将标识在完成此过程之前发生的所有操作,方法是关闭连接并破坏为此连接创建的对象集。

许多连接可能同时发生。在移动到pthreaded环境之前,我们能够使用Thread :: setName和%T标识符来清楚地看到哪些日志消息来自哪个连接。既然我们是多线程的,我们需要一个新的解决方案。

我一直无法找到一种干净的方法来使每个在连接生命周期中生成的对象知道我们的唯一标识符。全局会被新事务覆盖。将ID传递给每个新对象会很麻烦。

我的下一次尝试是使用POCO Logger通道框架将每个连接的日志保存到我们将在消息中收到的唯一标识符命名的新文件。这里的问题是,如果一个新连接在另一个连接期间进入,它将覆盖通道属性并开始将日志指向另一个文件。

使用Logger框架,我是否有办法为每个连接建立一个新的Logger层次结构?基本上,我们需要由新连接产生的对象集合使用相同的日志记录属性,并且不会影响任何其他对象记录属性集。

任何关于在连接生命周期内创建的所有对象之间共享标识符的正确方法的见解也是有用的。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您想存储少量信息,请使用singleton的{​​{1}}实例以及loggermutex来避免死锁< / em> / livelock 问题。
但是如果您期望有很多连接,那么阻塞互斥锁会减慢速度,因此您应该考虑每个连接使用1个记录器实例。

如果您要semaphore,请考虑使用singleton,因为它具有内置的死锁保护功能。