0

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

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

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

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

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

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

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

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

谢谢!

4

1 回答 1

0

如果您想存储少量信息,请使用singleton您的实例logger以及 amutex和 asemaphore以避免死锁/活锁问题。
但是,如果您期望有很多连接,则阻塞互斥锁会减慢速度,因此您应该考虑每个连接使用 1 个记录器实例。

如果您要singleton考虑使用std::mutex它,因为它具有内置的死锁保护。

于 2013-08-14T19:36:12.520 回答