【问题标题】:How do I create a custom Layout for log4cplus如何为 log4cplus 创建自定义布局
【发布时间】:2016-02-18 15:13:00
【问题描述】:

在搜索了感觉太长的东西之后,我决定在 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?

【问题讨论】:

    标签: c++ logging log4cplus


    【解决方案1】:

    在尝试了很多事情之后,归结为一个简单的条目,必须放在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 的文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2012-10-28
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多