00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <cstring>
00018 #include "StarOptionFilter.h"
00019 #include <log4cxx/spi/loggingevent.h>
00020 #include <log4cxx/helpers/optionconverter.h>
00021
00022
00023
00024 using namespace log4cxx;
00025 using namespace log4cxx::varia;
00026 using namespace log4cxx::spi;
00027 using namespace log4cxx::helpers;
00028
00029 IMPLEMENT_LOG4CXX_OBJECT(StarOptionFilter)
00030
00031
00032 String StarOptionFilter::ACCEPT_REPEAT_COUNTER = _T("RepeatMessageQuota");
00033 String StarOptionFilter::TOTAL_MESSAGE_LIMIT = _T("TotalMessagesQuota");
00034 String StarOptionFilter::STRING_TO_COUNT_OPTION = _T("StringToCount");
00035
00036
00037
00038 StarOptionFilter::StarOptionFilter() : acceptRepeatCounter(-1),acceptTotalCounter(-1)
00039 ,currentRepeatCounter(0),currentTotalCounter(0)
00040 ,matchPredefinedStringOnly(false)
00041 {
00042 }
00043
00044
00045 void StarOptionFilter::setOption(const String& option,
00046 const String& value)
00047 {
00048
00049
00050 if (equalsIgnoreCase(option, ACCEPT_REPEAT_COUNTER))
00051 {
00052 acceptRepeatCounter = OptionConverter::toInt(value,acceptRepeatCounter);
00053 }
00054 else if (equalsIgnoreCase(option,STRING_TO_COUNT_OPTION))
00055 {
00056 if ( lastLoggerMessageToCompare != value) {
00057 currentRepeatCounter = 0;
00058 lastLoggerMessageToCompare = value;
00059 matchPredefinedStringOnly = true;
00060 }
00061 if (lastLoggerMessageToCompare.empty())
00062 matchPredefinedStringOnly = false;
00063 }
00064 else if (equalsIgnoreCase(option,TOTAL_MESSAGE_LIMIT))
00065 {
00066 acceptTotalCounter = OptionConverter::toInt(value,acceptTotalCounter);
00067 }
00068 }
00069
00070 void StarOptionFilter::setRepeatCounterOption(int value)
00071 {
00072
00073
00074
00075
00076
00077
00078
00079
00080 acceptRepeatCounter = value;
00081 }
00082
00083
00084 void StarOptionFilter::setTotalCounterOption(int value)
00085 {
00086
00087
00088
00089
00090
00091
00092
00093 acceptTotalCounter = value;
00094 }
00095
00096 Filter::FilterDecision StarOptionFilter::decide(
00097 const log4cxx::spi::LoggingEventPtr& event) const
00098 {
00099 Filter::FilterDecision decision = Filter::NEUTRAL;
00100 const String& msg = event->getRenderedMessage();
00101
00102
00103 if( !msg.empty() ) {
00104 #if 1
00105 if ( (acceptRepeatCounter >= 0 ) || (acceptTotalCounter >= 0 ) )
00106 {
00107 bool count = !matchPredefinedStringOnly
00108 ||
00109 (matchPredefinedStringOnly && strstr(msg.c_str(),lastLoggerMessageToCompare.c_str())) ;
00110 if (count) {
00111 if (acceptRepeatCounter >= 0 ) currentRepeatCounter++;
00112 if (acceptTotalCounter >= 0 ) currentTotalCounter++;
00113 } else {
00114
00115 currentRepeatCounter = 0;
00116 if (!matchPredefinedStringOnly && (acceptRepeatCounter >= 0 ) )
00117 lastLoggerMessageToCompare = msg;
00118 }
00119
00120 if( count && (acceptRepeatCounter >=0 ) && (currentRepeatCounter > acceptRepeatCounter) )
00121 decision = Filter::DENY;
00122
00123 if( count && (acceptTotalCounter >=0) && (currentTotalCounter > acceptTotalCounter) )
00124 decision = Filter::DENY;
00125 }
00126 #else
00127 if (acceptRepeatCounter >= 0 ) {
00128 if( strcmp(msg.c_str(),lastLoggerMessageToCompare.c_str() ) )
00129 {
00130 if (!matchPredefinedStringOnly) {
00131 currentRepeatCounter = 2;
00132 lastLoggerMessageToCompare = msg;
00133 }
00134 }
00135 else
00136 {
00137
00138 if(currentRepeatCounter > acceptRepeatCounter) decision = Filter::DENY;
00139 currentRepeatCounter++;
00140 }
00141 }
00142 #endif
00143 }
00144 return decision;
00145 }