2015-11-17 4 views
3

После поиска того, что слишком долго, я решил задать этот простой вопрос о stackoverflow: Как создать настраиваемый макет для log4cplus (1.1.2)? Ближайший связанный вопрос: How do I add a custom filter in log4cplus?, где автор добавляет новый класс непосредственно в каталог log4cplus (или использует пространство имен log4cplus?). У меня нет этой опции в качестве заголовков log4plus и библиотеки устанавливаются независимо друг от друга (и просто установка пространства имен log4cplus не работает либоКак создать настраиваемый макет для 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" 

Как я могу зарегистрировать пользовательский макет/приложение?

ответ

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 одна

Смежные вопросы