2

これは、条件付きログに関するこの質問のフォローアップです。

log4cplus テスト ディレクトリで、プロパティ ファイルでフィルターを構成する方法の例を見つけました (そのため、XML を使用する必要はありません)。独自のフィルターを作成しましたが、使用に問題があります。ここに私が行った変更があります:

spi/filter.h:

class LOG4CPLUS_EXPORT InstructionNumberFilter : public Filter {
    public:
      // ctors
        InstructionNumberFilter();
        InstructionNumberFilter(const log4cplus::helpers::Properties& p);

        /**
         * Returns {@link #NEUTRAL} is there is no string match.
         */
        virtual FilterResult decide(const InternalLoggingEvent& event) const;

    private:
      // Methods
        LOG4CPLUS_PRIVATE void init();

      // Data
        /** Do we return ACCEPT when a match occurs. Default is <code>true</code>. */
        uint instructionNumberToMatch;

};

spi/filter.cxx:

InstructionNumberFilter::InstructionNumberFilter()
{
    init();
}

InstructionNumberFilter::InstructionNumberFilter(const helpers::Properties& properties)
{
    init();
    properties.getUInt(instructionNumberToMatch, LOG4CPLUS_TEXT("InstructionNumber"));    
}    

void
InstructionNumberFilter::init()
{
    instructionNumberToMatch = 0;
}    

FilterResult
InstructionNumberFilter::decide(const InternalLoggingEvent& event) const
{
    const uint currentInstructionNumber = 4; // TODO get number from MDC

    if( currentInstructionNumber == instructionNumberToMatch ){
        return ACCEPT;
    }

    return NEUTRAL;
}

factory.cxx 内:

LOG4CPLUS_REG_FILTER (reg3, InstructionNumberFilter);

プロパティファイルで:

# Set up logging to standard output stream.

log4cplus.appender.AP1=log4cplus::ConsoleAppender
log4cplus.appender.AP1.layout=log4cplus::PatternLayout
log4cplus.appender.AP1.layout.ConversionPattern=Rabble %-5p MDC(instructionNumber):%-10X{instructionNumber} [%d{%Q}](%l): %m

log4cplus.appender.AP1.filters.1=log4cplus::spi::InstructionNumberFilter
log4cplus.appender.AP1.filters.1.InstructionNumberToMatch=4
log4cplus.appender.AP1.filters.2=log4cplus::spi::DenyAllFilter

実行すると、次のエラーが表示されます。

log4cplus:ERROR Appender::ctor()- Cannot find FilterFactory: log4cplus::spi::InstructionNumberFilter

StringMatchFilter の実装に基づいてすべての変更を行うようにしました。フィルターが認識されるようにするために必要なことが他にありませんか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

このエラーは、log4cplus からビルドされたライブラリを誤って配置した結果でした。

上記の例、log4cplus でカスタム フィルターを実装する方法です。ウェブ上には log4cplus フィルターの例がほとんどないため、誰も反対しない限り、ここに残しておきます。

于 2014-04-08T19:50:44.433 に答える