c++ - 接口(interface)与个人记录器

标签 c++ logging log4cxx

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

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

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 所做的事情是正确的做法吗?因为我需要能够选择要使用的记录器。

另外,如果创建一个日志接口(interface)更好,有人可以推荐一个很好的例子,在这个例子中可以看到如何使用 log4cxx 实现这样一个接口(interface)的细节吗?因此,例如,什么需要私有(private),什么需要公开等。

最佳答案

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

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

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

关于c++ - 接口(interface)与个人记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33208980/

相关文章:

mongodb - 是否可以将 MongoDb 上限集合与 phalcon 集合模型一起使用

c++ - 如何在gdb/lldb调试中打印模板成员函数返回的值

logging - 环回强错误处理程序并将错误记录到文件中

c++ - 数组中的 OpenCv Mat 初始化不起作用

logging - 当我对sinatra应用程序进行docker化时,该应用程序的日志文件会如何处理?

visual-c++ - Log4cxx DailyRollingFileAppender 未滚动

xml - log4cxx 配置中多次使用的单一值定义

c++ - 如何在 Visual Studio 2015 中构建 log4cxx

c++ - RegSetValueEx() 不改变键值

C++流、函数声明等问题