2015-10-19 36 views
0

我想在我正在开发的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实现这样一个接口的实质吗?所以,例如,什么需要是私人的,什么需要公开等。

+0

记录器实际上是只有*一个*实例的记录器,并在需要时使用它 –

+0

至于如何“选择”一个地方的单身模式(https://en.wikipedia.org/wiki/Singleton_pattern)要使用哪个记录器,可以将其包装在预处理器宏中,因此只能编写例如'LOG1(“...”)',那个宏将得到正确的记录器并用记录器调用写入功能。 –

回答

1

是的,你不应该重新在你的类中实现日志记录。它重复着你自己,并且磨砺每个班级的责任。然而,决定哪一个log4cxx::LoggerPtr使用听起来像是某个呼叫类的东西不应该关心,听起来像是应该在Logger类中作出的决定

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

我真的认为选择怎样的东西,已经发生为可读std::string msg格式而不是类,我会把一些抽象的Event类发送给记录器,我一直试图记住这个模式叫做什么(如果它甚至是一个模式),here's an example of it in another language

+0

好的答案,只是对C++和IOC的评论 - 手动IOC布线仍然存在于C++中,并且IOC _container_(这是您链接的内容)不是_needed_,它只是使它更容易(至少在C#和Java版本中 - 我见过的C++中没有让我想放弃手动方式:-)) –

+0

@JohannGerell是的。 Tbh,没有一个容器看起来完全准备好。我只链接,因为这促使我做一些Google搜索。我有点惊讶Boost至少没有什么东西。 C++不是我的第一语言,它显示:D –