sdeboy 2003/10/27 00:35:31
Modified: src/java/org/apache/log4j/chainsaw
LoggingEventFieldResolver.java
Added: src/java/org/apache/log4j/varia ExpressionFilter.java
Log:
First commit of ExpressionRule-based filter - see the org.apache.log4j.chainsaw.rule
package and org.apache.log4j.chainsaw.LoggingEventFieldResolver for more information.
Supported operators: !, ==, !=, ~= (partial text), like (ORO), <, <=, >, >=, ||, &&
Supported event keywords:
LOGGER
LEVEL
CLASS
FILE
LINE
METHOD
MSG
NDC
EXCEPTION
TIMESTAMP
THREAD
MDC.*
PROP.*
NOTE: MDC and Properties require a user-specified parameter to do the lookup in the
table - specified after the '.' - for example, MDC.userID
Also supports grouping via parentheses.
Revision Changes Path
1.1
jakarta-log4j/src/java/org/apache/log4j/varia/ExpressionFilter.java
Index: ExpressionFilter.java
===================================================================
/*
* ============================================================================
* The Apache Software License, Version 1.1
* ============================================================================
*
* Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by the Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "log4j" and "Apache Software Foundation" must not be used to
* endorse or promote products derived from this software without prior
* written permission. For written permission, please contact
* [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache", nor may
* "Apache" appear in their name, without prior written permission of the
* Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Apache Software Foundation. For more information on the
* Apache Software Foundation, please see <http://www.apache.org/>.
*
*/
package org.apache.log4j.varia;
import org.apache.log4j.chainsaw.rule.ExpressionRule;
import org.apache.log4j.chainsaw.rule.Rule;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
/**
*A filter supporting complex expressions - supports both infix and postfix
expressions
*(infix expressions must first be converted to postfix prior to processing).
*
*See <code>org.apache.log4j.chainsaw.LoggingEventFieldResolver.java</code>
*for the correct names for logging event fields used when building expressions.
*
*See <org.apache.log4j.chainsaw.rule</code> package for a list of available rules
which can
*be applied using the expression syntax.
*
*See <code>org.apache.log4j.chainsaw.RuleFactory</code> for the symbols used to
*activate the corresponding rules.
*
*NOTE: Grouping using parentheses is supported - all tokens must be separated by
spaces, and
*operands which contain spaces are not yet supported.
*
*Example:
*
*In order to build a filter that displays all messages with infomsg-45 or
infomsg-44 in the message,
*as well as all messages with a level of WARN or higher, build an expression using
*the LikeRule (supports ORO-based regular expressions) and the InequalityRule.
* <b> ( MSG LIKE infomsg-4[4,5] ) && ( LEVEL >= WARN ) </b>
*
*Three options are required:
* <b>Expression</b> - the expression to match
* <b>ConvertInFixToPostFix</b> - convert from infix to posfix (default true)
* <b>AcceptOnMatch</b> - true or false (default true)
*
* Meaning of <b>AcceptToMatch</b>:
* If there is a match between the value of the
* Expression option and the [EMAIL PROTECTED] LoggingEvent} and AcceptOnMatch is
true,
* the [EMAIL PROTECTED] #decide} method returns [EMAIL PROTECTED] Filter#ACCEPT}.
*
* If there is a match between the value of the
* Expression option and the [EMAIL PROTECTED] LoggingEvent} and AcceptOnMatch is
false,
* [EMAIL PROTECTED] Filter#DENY} is returned.
*
* If there is no match, [EMAIL PROTECTED] Filter#NEUTRAL} is returned.
*
* @author Scott Deboy [EMAIL PROTECTED]
*/
public class ExpressionFilter extends Filter {
boolean acceptOnMatch = true;
boolean convertInFixToPostFix = true;
String expression;
Rule expressionRule;
public void activateOptions() {
expressionRule =
ExpressionRule.getRule(expression, !convertInFixToPostFix);
}
public void setExpression(String expression) {
this.expression = expression;
}
public String getExpression() {
return expression;
}
public void setConvertInFixToPostFix(boolean convertInFixToPostFix) {
this.convertInFixToPostFix = convertInFixToPostFix;
}
public boolean getConvertInFixToPostFix() {
return convertInFixToPostFix;
}
public void setAcceptOnMatch(boolean acceptOnMatch) {
this.acceptOnMatch = acceptOnMatch;
}
public boolean getAcceptOnMatch() {
return acceptOnMatch;
}
/**
Returns [EMAIL PROTECTED] Filter#NEUTRAL} is there is no string match.
*/
public int decide(LoggingEvent event) {
if ((expression == null)) {
return Filter.NEUTRAL;
}
if (expressionRule.evaluate(event)) {
if (acceptOnMatch) {
return Filter.ACCEPT;
} else {
return Filter.DENY;
}
} else {
return Filter.NEUTRAL;
}
}
}
1.8 +5 -6
jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggingEventFieldResolver.java
Index: LoggingEventFieldResolver.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggingEventFieldResolver.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LoggingEventFieldResolver.java 27 Oct 2003 08:22:15 -0000 1.7
+++ LoggingEventFieldResolver.java 27 Oct 2003 08:35:31 -0000 1.8
@@ -87,9 +87,8 @@
* NOTE: the values for the 'keyName' portion of the MDC and PROP mappings must
* be an exact match to the key in the hashTable (case sensitive).
*
- * If the passed-in field is null, an empty string is returned.
- * If the passed-in field doesn't match an entry in the above-described
- * mapping, the passed-in field is returned.
+ * If the passed-in field is null or doesn't match an entry in the above-described
+ * mapping, an exception is thrown.
*
* @author Scott Deboy <[EMAIL PROTECTED]>
* @author Paul Smith <[EMAIL PROTECTED]>
@@ -144,7 +143,7 @@
public Object getValue(String fieldName, LoggingEvent event) {
if (fieldName == null) {
- return EMPTY_STRING;
+ throw new RuntimeException("null field name");
}
String upperField = fieldName.toUpperCase();
@@ -177,12 +176,12 @@
//note: need to use actual fieldname since case matters
Object mdcValue = event.getMDC(fieldName.substring(4));
- return ((mdcValue == null) ? "" : mdcValue.toString());
+ return ((mdcValue == null) ? EMPTY_STRING : mdcValue.toString());
} else if (upperField.startsWith(PROP_FIELD)) {
//note: need to use actual fieldname since case matters
String propValue = event.getProperty(fieldName.substring(5));
- return ((propValue == null) ? "" : propValue);
+ return ((propValue == null) ? EMPTY_STRING : propValue);
}
//there wasn't a match, so throw a runtime exception
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]