Wie füge ich in log4cplus einen benutzerdefinierten Filter hinzu?

Dies ist eine Fortsetzung vondiese Frage auf bedingte Protokollierung.

Ich habe im log4cplus-Testverzeichnis Beispiele für die Konfiguration von Filtern in der Eigenschaftendatei gefunden (daher ist die Verwendung von XML nicht erforderlich). Ich habe einen eigenen Filter erstellt, habe jedoch Probleme bei der Verwendung. Hier sind die Änderungen, die ich vorgenommen habe:

In 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;

};

In 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;
}

In factory.cxx:

LOG4CPLUS_REG_FILTER (reg3, InstructionNumberFilter);

In der Eigenschaftendatei:

# 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

Wenn ich renne bekomme ich den Fehler:

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

Ich habe versucht, alle meine Änderungen auf die Implementierung des StringMatchFilter zu stützen. Fehlt mir noch etwas, was ich tun muss, damit mein Filter erkannt wird?

Danke für Ihre Hilfe.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage