2009-05-17 51 views
4

log4cxx用のカスタムアペンダーを作成し、プロパティーファイル(組み込みアペンダーのようなもの)で設定することはできますか?可能であれば、log4cxxを再構築することなく(例えば、既存のappenderを派生/拡張することなく)これを行うことを好むでしょう。Log4cxxカスタムアペンダー

例に向けて教えていただけますか?

答えて

6

log4cxxを再構築しなくても、AppenderSkeletonまたはWriterAppenderから継承し、同じ根本的な動作を得ることができます。

http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/vectorappender.h?view=markup http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/vectorappender.cpp?view=markup

+1

デフォルトアペンダーのように、プロパティファイルを使用して設定する方法を教えてください。 –

+1

ここで説明されているように、オーバーライド関数 'setOption'があります:http://stackoverflow.com/a/36498559/838509 – Andrzej

3

brlcadの提案は正しいです - 私の会社では、我々は我々自身のカスタムアペンダのために、この方法を使用しました。

実際には、クラス定義内のDECLARE_LOG4CXX_OBJECT(CustomAppenderClassName)のようなマクロから、log4cxx環境を設定する構成ファイルからこれらを設定できます。 appenderの種類は、 "CustomAppenderClassName"で参照できます。 たconfigfile(古いスタイル)カスタムアペンダのための標準的なレイアウトを使用して、標準およびカスタムアペンダを示す:ほとんどの定格の答えのリンクからのように見えるよう

# 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を使用してカスタムアペンダーを作成しました.SysLogAppenderで行われたことに従います。高いレベルでは、次の手順を実行する必要があります。

  • Appenderクラスを継承する独自のクラスを作成します。
  • 純粋な仮想関数を実装します。void close()void append(const spi::InternalLoggingEvent& event)
  • AppenderFactoryRegistryでappenderクラスを登録します。ここで

名前空間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 

私はこのコードを他のコードを切り詰めて作成したので、それ自体がこの正確なフォーマットでコンパイルされていません。問題があれば教えてください。私はそれを修正します。

+1

log4cplusとlog4cxxは2つの異なるフレームワークです。 – bvj

+0

ああ、それは分かりませんでした。彼らはかなり似ています。 –

+0

これは良い例です。この記事への参照を追加しました:http://stackoverflow.com/questions/36992430/how-do-i-send-log4cplus-appender-output-to-a-memory-buffer – bvj

関連する問題