【问题标题】:POCO C++: Can you have multiple logging hierarchies?POCO C++:你可以有多个日志记录层次结构吗?
【发布时间】:2013-08-16 21:57:24
【问题描述】:

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

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 你能简化你的问题吗?

标签: c++ logging poco-libraries


【解决方案1】:

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

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

【讨论】:

  • 我们处理许多连接。每个新连接(和对象)都有自己的 Logger 对象...问题是 Logger 的通道属性是全局应用的,甚至适用于由新连接实例化的新对象。
  • @user2137989 然后滚动你自己的记录器......这并不难!
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多