2009-05-17 95 views
4

是否可以爲log4cxx編寫自定義appender並通過屬性文件(如內置appender)配置它?如果可能的話,我寧願這樣做,而不必重新構建log4cxx(例如通過派生/擴展現有的appender)。Log4cxx自定義appender

你能指點我一個例子嗎?

回答

6
+1

如何讓它可以通過屬性文件進行配置,就像默認的appender一樣? – 2009-05-17 15:19:57

+1

重寫函數`setOption`如下所示:http://stackoverflow.com/a/36498559/838509 – Andrzej 2016-04-08 11:40:22

3

brlcad的建議是正確的 - 在我的公司,我們已經用我們自己定製的appender此方法。

實際上,您可以從配置文件 - 類定義中的DECLARE_LOG4CXX_OBJECT(CustomAppenderClassName)等宏設置log4cxx環境。你可以通過你的「CustomAppenderClassName」來引用你的appender類型。 一個CONFIGFILE(老式)表示標準和定製的附加器,採用標準佈局爲自定義的appender:

# Set "realtime" logger level to DEBUG and create two appenders - one to be 
# a standard rolling file appender, the other custom. 
log4j.logger.realtime=ERROR, StandardAppender, CustomAppender 

# StandardAppenderis set to be a RollingFileAppender 
log4j.appender.StandardAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.StandardAppender.File=example.log 

log4j.appender.StandardAppender.MaxFileSize=100KB 
# Keep one backup file 
log4j.appender.StandardAppender.MaxBackupIndex=1 

# StandardAppender uses PatternLayout. 
log4j.appender.StandardAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.StandardAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

# CustomAppender uses PatternLayout too 
log4j.appender.CustomAppender=CustomAppenderClassName 
log4j.appender.CustomAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.CustomAppender.layout.ConversionPattern=%m 
1

我加入了這個答案,因爲在大多數額定答案的鏈接似乎是從舊版本。我已經使用version 1.2.0創建了一個自定義的appender,它遵循在他們的SysLogAppender中完成的操作。在高層次上,您需要執行以下步驟:

  • 創建一個繼承它們的Appender類的自己的類。
  • 執行純虛函數void close()void append(const spi::InternalLoggingEvent& event)
  • 註冊您的appender類與AppenderFactoryRegistry。

下面是一個例子類與命名空間yournamespace :: ExampleCustomAppender類代碼:

#include <log4cplus/appender.h> 

namespace yournamespace { 
    class ExampleCustomAppender : public Appender 
    { 
    public: 
     ExampleCustomAppender(const log4cplus::helpers::Properties & properties); 

     // Dtor 
     virtual ~ExampleCustomAppender(); 

     // Methods 
     virtual void close(); 

     /** Register the appender with the factory registry. */ 
     static void registerAppender(); 

    protected: 
     virtual void append(const spi::InternalLoggingEvent& event); 
    }; 
} 

隨後的方法實現:

#include <log4cplus/spi/factory.h> 
#include <sstream> 

namespace yournamespace { 

    ExampleCustomAppender::ExampleCustomAppender(const helpers::Properties & properties) 
     : Appender(properties) 
    { 
    // if you want to use properties to configure your object do so here 
    } 

    ExampleCustomAppender::~ExampleCustomAppender() 
    { 
    } 

    void ExampleCustomAppender::registerAppender() 
    { 
     log4cplus::spi::AppenderFactoryRegistry & reg 
      = log4cplus::spi::getAppenderFactoryRegistry(); 
     LOG4CPLUS_REG_PRODUCT(reg, "log4cplus::", ExampleCustomAppender, 
      yournamespace::, log4cplus::spi::AppenderFactory); 
    } 

    void ExampleCustomAppender::close() 
    { 
     // do anything you need to close the appender 
     closed = true; 
    } 

    // This method does not need to be locked since it is called by 
    // doAppend() which performs the locking 
    void LoggingCallbackAppender::append(const spi::InternalLoggingEvent& event) 
    { 
     if (!closed) { 
      std::stringstream logOutput; 
      layout->formatAndAppend(logOutput, event); 
      std::string outputString = logOutput.str(); 
     } 
    } 
} 

,最後如何爲例它可以用在配置文件中:

log4cplus.rootLogger=INFO, STDOUT, ROLLING, EXAMPLE 
// other definitions for STDOUT and ROLLING here and then ... 
log4cplus.appender.EXAMPLE=log4cplus::ExampleCustomAppender 
log4cplus.appender.EXAMPLE.layout=log4cplus::PatternLayout 
log4cplus.appender.EXAMPLE.layout.ConversionPattern=%d{%m/%d %H:%M:%S} [%t] %-5p %c{2} - %m%n 

我通過刪減一些其他代碼來完成這個代碼,所以它沒有以這種確切的格式編譯。讓我知道任何問題,我會糾正它。

相關問題