如何为 log4cplus 创建自定义布局
How do I create a custom Layout for log4cplus
在搜索了感觉太长的内容后,我决定在 Whosebug 上问这个简单的问题:
如何为 log4cplus (1.1.2) 创建自定义布局?
最接近的相关问题是 How do I add a custom filter in log4cplus?,其中作者将新的 class 直接添加到 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 负责将我的 class 注册到 log4cplus 框架,以便我可以在配置文件中使用它。但是,添加
log4cplus.appender.STDOUT.layout=myNameSpace::MyPatternLayout
导致错误:
log4cplus:ERROR Cannot find LayoutFactory: "myNameSpace::MyPatternLayout"
那么我该如何注册自定义 Layout/Appender?
在尝试了很多事情之后,归结为一个简单的条目,必须放在 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 的文档
在搜索了感觉太长的内容后,我决定在 Whosebug 上问这个简单的问题: 如何为 log4cplus (1.1.2) 创建自定义布局? 最接近的相关问题是 How do I add a custom filter in log4cplus?,其中作者将新的 class 直接添加到 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 负责将我的 class 注册到 log4cplus 框架,以便我可以在配置文件中使用它。但是,添加
log4cplus.appender.STDOUT.layout=myNameSpace::MyPatternLayout
导致错误:
log4cplus:ERROR Cannot find LayoutFactory: "myNameSpace::MyPatternLayout"
那么我该如何注册自定义 Layout/Appender?
在尝试了很多事情之后,归结为一个简单的条目,必须放在 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 的文档