これは、条件付きログに関するこの質問のフォローアップです。
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 の実装に基づいてすべての変更を行うようにしました。フィルターが認識されるようにするために必要なことが他にありませんか?
ご協力いただきありがとうございます。