【问题标题】:Interface vs. Individual Loggers接口与单个记录器
【发布时间】:2016-01-17 11:30:06
【问题描述】:

我想在我正在处理的 C++ 项目中实现记录器。我想知道是在每个类中单独实现一个记录器,还是使用一个日志接口并使用 log4cxx 库在每个类中实例化它的一个实例会更好。我有一些我想实现的记录器,它们可以记录现有类中的事件。

在使用日志接口时,我的意思是:

class Logger
{
private:
    log4cxx::LoggerPtr firstLogger(log4cxx::Logger::getLogger("first.log"));
    log4cxx::LoggerPtr secondLogger(log4cxx::Logger::getLogger("second.log"));
public:
    virtual void writeLogMessage(log4cxx::LoggerPtd logger, std::string msg);
};

通过 LoggerPtr 传递我正在做的事情是正确的做法吗?因为我需要能够选择要使用的记录器。

另外,如果创建一个日志接口更好,有人可以提出一个很好的例子,让人们可以看到如何使用 log4cxx 实现这样的接口的本质?因此,例如,什么需要私有,什么需要公开等。

【问题讨论】:

  • Loggers 实际上是singleton pattern 有用的地方之一。只有 一个 记录器实例,并在需要时使用它。
  • 至于如何“选择”要使用的记录器,您可以将其包装在预处理器宏中,因此您只需编写例如LOG1("...") 并且该宏将获取正确的记录器并使用记录器调用写入函数。

标签: c++ logging log4cxx


【解决方案1】:

是的,您不应该在您的课程中重新实现日志记录。这是在重复自己,混淆了每个班级的职责。决定使用哪个 log4cxx::LoggerPtr 听起来像是调用类不应该关心的事情,听起来像是应该在 Logger 类中做出决定的决定

但是,不要在您的类中创建实例。为您的记录器创建一个抽象类并将其传递给您的类的构造函数。不要将您的类绑定到一个记录器实现,而是在更高的位置或在您的 IOC 配置代码中选择它。 (我从未在 C++ 中使用过 IOC,but this one 看起来不错。顺便说一句,您的记录器的多个实现会解决您的多个 log4cxx::LoggerPtr 问题吗?

我实际上会争辩说,选择如何将发生的事情格式化为可读的std::string msg 是记录器的工作,而不是类的工作。我会向记录器发送一些抽象的Event 类。我一直在努力记住这个模式叫什么(如果它甚至是一个模式),here's an example of it in another language

【讨论】:

  • 好答案,只是对 C++ 和 IOC 的评论 - C++ 中仍然存在手动 IOC 接线,而 IOC container (这是您链接到的)不是 需要它只是让它更容易(至少在 C# 和 Java 领域——我见过的 C++ 并没有让我想放弃手动方式:-))
  • @JohannGerell 是的。 Tbh,没有一个容器看起来完全准备好了。我只是链接,因为这促使我做一些谷歌搜索。我有点惊讶 Boost 至少没有什么东西。 C++ 不是我的第一语言,它显示 :D
猜你喜欢
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2017-12-05
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2020-07-21
相关资源
最近更新 更多