如何为log4cplus

时间:2015-11-17 09:48:49

标签: c++ logging log4cplus

在搜索了太长时间后,我决定在stackoverflow上提出这个简单的问题: 如何为log4cplus(1.1.2)创建自定义布局? 最接近的相关问题是How do I add a custom filter in log4cplus?,作者将新类直接添加到log4cplus目录中(或使用log4cplus名称空间?)。我没有这个选项,因为log4plus标头和库是独立安装的(只是将命名空间设置为log4cplus也不起作用。

我尝试的是从log4cplus :: PatternLayout继承的最小示例:

namespace myNameSpace {
  class LOG4CPLUS_EXPORT MyPatternLayout: public ::log4cplus::PatternLayout {
    public:
       MyPatternLayout(const log4cplus::tstring& pattern);
       MyPatternLayout(const log4cplus::helpers::Properties& properties);
      ~MyPatternLayout();
    private:
      // Disallow copying of instances of this class
      MyPatternLayout(const MyPatternLayout&);
      MyPatternLayout& operator=(const MyPatternLayout&);
};
}

我希望LOG4CPLUS_EXPORT负责将我的类注册到log4cplus框架,以便我可以在配置文件中使用它。但是,添加

log4cplus.appender.STDOUT.layout=myNameSpace::MyPatternLayout

导致错误:

log4cplus:ERROR Cannot find LayoutFactory: "myNameSpace::MyPatternLayout"

那么如何注册自定义Layout / Appender?

1 个答案:

答案 0 :(得分:0)

在尝试了很多事情之后,归结为一个简单的条目,必须在log4cplus::initialize();之后和log4cplus::PropertyConfigurator::doConfigure("<path to config file");之前。 如果要在log4cplus命名空间中添加新布局,只需

即可
//example1
log4cplus::initialize();
// register our stuff
log4cplus::spi::LayoutFactoryRegistry& reg = log4cplus::spi::getLayoutFactoryRegistry();
LOG4CPLUS_REG_LAYOUT(reg, MyPatternLayout);
log4cplus::PropertyConfigurator::doConfigure(Logger::mConfigFile);

或者,如果您想使用自己的命名空间

 //example2
 log4cplus::initialize();
 // register our stuff
 log4cplus::spi::LayoutFactoryRegistry& reg = log4cplus::spi::getLayoutFactoryRegistry();
 LOG4CPLUS_REG_PRODUCT (reg, "myNamespace::", MyPatternLayout, myNamespace::, log4cplus::spi::LayoutFactory);
 log4cplus::PropertyConfigurator::doConfigure(Logger::mConfigFile);

然后,您可以使用配置中的布局

log4cplus.appender.STDOUT.layout = log4cplus::MyPatternLayout #example 1

log4cplus.appender.STDOUT.layout = myNamespace::MyPatternLayout #example 2

够简单吧?我希望log4cplus有一个更接近.log4j的文档