sdeboy 2003/10/25 00:52:55 Modified: src/java/org/apache/log4j/chainsaw/rule LevelInequalityRule.java RuleTest.java InequalityRule.java src/java/org/apache/log4j/chainsaw LoggingEventFieldResolver.java Log: Corrected inequality rule logic errors, added example ruletest expression demonstrating regular expressions, inequality and access of MDC entries in the expressions. Revision Changes Path 1.2 +70 -64 jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/LevelInequalityRule.java Index: LevelInequalityRule.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/LevelInequalityRule.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LevelInequalityRule.java 24 Oct 2003 08:04:03 -0000 1.1 +++ LevelInequalityRule.java 25 Oct 2003 07:52:55 -0000 1.2 @@ -49,78 +49,84 @@ package org.apache.log4j.chainsaw.rule; +import org.apache.log4j.Level; +import org.apache.log4j.UtilLoggingLevel; +import org.apache.log4j.chainsaw.LoggingEventFieldResolver; +import org.apache.log4j.spi.LoggingEvent; + import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Stack; -import org.apache.log4j.Level; -import org.apache.log4j.UtilLoggingLevel; -import org.apache.log4j.chainsaw.LoggingEventFieldResolver; -import org.apache.log4j.spi.LoggingEvent; + /** * A Rule class implementing inequality evaluation for Levels (log4j and util.logging) using the toInt method. * * @author Scott Deboy <[EMAIL PROTECTED]> */ - class LevelInequalityRule extends AbstractRule { - LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance(); - - Level levelFirstParam; - String levelSecondParam; - List utilList = new LinkedList(); - List levelList = new LinkedList(); - String inequalitySymbol; - - private LevelInequalityRule(String inequalitySymbol, String levelFirstParam, String levelSecondParam) { - levelList.add(Level.FATAL.toString()); - levelList.add(Level.ERROR.toString()); - levelList.add(Level.WARN.toString()); - levelList.add(Level.INFO.toString()); - levelList.add(Level.DEBUG.toString()); - - Iterator iter = UtilLoggingLevel.getAllPossibleLevels().iterator(); - while (iter.hasNext()) { - utilList.add(((UtilLoggingLevel)iter.next()).toString()); - } - - if (levelList.contains(levelFirstParam)) { - this.levelFirstParam = Level.toLevel(levelFirstParam); - } else { - this.levelFirstParam = UtilLoggingLevel.toLevel(levelFirstParam); - } - this.inequalitySymbol = inequalitySymbol; - this.levelSecondParam = levelSecondParam; - } - - static Rule getRule(String inequalitySymbol, Stack stack) { - String p1 = stack.pop().toString(); - String p2 = stack.pop().toString(); - return new LevelInequalityRule(inequalitySymbol, p1, p2); - } - - public boolean evaluate(LoggingEvent event) { - //use the type of the first level to access the static toLevel method on the second param - Level level2 = levelFirstParam.toLevel(resolver.getValue(levelSecondParam, event).toString()); - System.out.println("lessthan level op " + levelFirstParam + ".." + level2); - - boolean result = false; - int first = levelFirstParam.toInt(); - int second = level2.toInt(); - - if ("<".equals(inequalitySymbol)) { - result = first < second; - } else if (">".equals(inequalitySymbol)) { - result = first > second; - } else if ("<=".equals(inequalitySymbol)){ - result = first <= second; - } else if (">=".equals(inequalitySymbol)) { - result = first >= second; - } - System.out.println("result is " + result); - - return result; - } - - } \ No newline at end of file + LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance(); + Level levelFirstParam; + String levelSecondParam; + List utilList = new LinkedList(); + List levelList = new LinkedList(); + String inequalitySymbol; + + private LevelInequalityRule( + String inequalitySymbol, String levelFirstParam, String levelSecondParam) { + levelList.add(Level.FATAL.toString()); + levelList.add(Level.ERROR.toString()); + levelList.add(Level.WARN.toString()); + levelList.add(Level.INFO.toString()); + levelList.add(Level.DEBUG.toString()); + + Iterator iter = UtilLoggingLevel.getAllPossibleLevels().iterator(); + + while (iter.hasNext()) { + utilList.add(((UtilLoggingLevel) iter.next()).toString()); + } + + if (levelList.contains(levelFirstParam)) { + this.levelFirstParam = Level.toLevel(levelFirstParam); + } else { + this.levelFirstParam = UtilLoggingLevel.toLevel(levelFirstParam); + } + + this.inequalitySymbol = inequalitySymbol; + this.levelSecondParam = levelSecondParam; + } + + static Rule getRule(String inequalitySymbol, Stack stack) { + String p1 = stack.pop().toString(); + String p2 = stack.pop().toString(); + + return new LevelInequalityRule(inequalitySymbol, p1, p2); + } + + public boolean evaluate(LoggingEvent event) { + //use the type of the first level to access the static toLevel method on the second param + Level level2 = + levelFirstParam.toLevel( + resolver.getValue(levelSecondParam, event).toString()); + System.out.println("lessthan level op " + levelFirstParam + ".." + level2); + + boolean result = false; + int first = level2.toInt(); + int second = levelFirstParam.toInt(); + + if ("<".equals(inequalitySymbol)) { + result = first < second; + } else if (">".equals(inequalitySymbol)) { + result = first > second; + } else if ("<=".equals(inequalitySymbol)) { + result = first <= second; + } else if (">=".equals(inequalitySymbol)) { + result = first >= second; + } + + System.out.println("result is " + result); + + return result; + } +} 1.10 +135 -130 jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java Index: RuleTest.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- RuleTest.java 23 Oct 2003 09:18:12 -0000 1.9 +++ RuleTest.java 25 Oct 2003 07:52:55 -0000 1.10 @@ -49,9 +49,16 @@ package org.apache.log4j.chainsaw.rule; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.MDC; +import org.apache.log4j.chainsaw.LoggingEventFieldResolver; +import org.apache.log4j.spi.LoggingEvent; + import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; + import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -65,136 +72,134 @@ import javax.swing.JTextField; import javax.swing.WindowConstants; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.chainsaw.LoggingEventFieldResolver; -import org.apache.log4j.spi.LoggingEvent; public class RuleTest extends JFrame { - /** - * UI for demonstrating infix/postfix conversion and expression rule evaluation...work in progress... - * - * Infix to postfix conversion routines and evaluation methods for boolean expressions. - * See http://www.qiksearch.com/articles/cs/infix-postfix/ - * and http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/ - * - * for more information. - * - * @author Scott Deboy <[EMAIL PROTECTED]> - * - */ - Rule rule; - public RuleTest(String booleanPostFixExpression, String inFixExpression) { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - getContentPane().setLayout(new BorderLayout()); - - final LoggingEventFieldResolver resolver = - LoggingEventFieldResolver.getInstance(); - - final List eventList = new ArrayList(); - - eventList.add( - new LoggingEvent( - "org.apache.log4j.chainsaw", - Logger.getLogger("logger1"), - System.currentTimeMillis(), - Level.DEBUG, - "message1", - new Exception("test"))); - eventList.add( - new LoggingEvent( - "org.apache.log4j.chainsaw", - Logger.getLogger("logger2"), - System.currentTimeMillis(), - Level.DEBUG, - "message2", - new Exception("test2"))); - eventList.add( - new LoggingEvent( - "org.apache.log4j.net", - Logger.getLogger("logger3"), - System.currentTimeMillis(), - Level.DEBUG, - "message3", - new Exception("test3"))); - eventList.add( - new LoggingEvent( - "org.apache.log4j.chainsaw", - Logger.getLogger("logger4"), - System.currentTimeMillis(), - Level.WARN, - "message4", - new Exception("test4"))); - - JPanel fieldPanel = new JPanel(new GridLayout(5, 1)); - - fieldPanel.add( - new JLabel("Enter infix expression to convert to postfix: ")); - - final JTextField inFixTextField = new JTextField(inFixExpression); - fieldPanel.add(inFixTextField); - - JButton inFixButton = new JButton("Convert InFix to PostFix"); - fieldPanel.add(inFixButton); - - JLabel resultsLabel = new JLabel("Results:"); - fieldPanel.add(resultsLabel); - - final JTextField inFixResult = new JTextField(); - fieldPanel.add(inFixResult); - inFixButton.addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent evt) { - InFixToPostFix inFixConverter = new InFixToPostFix(); - inFixResult.setText( - inFixConverter.convert(inFixTextField.getText())); - rule = ExpressionRule.getRule(inFixResult.getText(), true); - } - }); - - JPanel resultsPanel = new JPanel(new BorderLayout()); - - JButton resultsButton = - new JButton("Evaluate postfix expression against collection of events: "); - resultsPanel.add(resultsButton, BorderLayout.NORTH); - - final JTextArea results = new JTextArea(5, 50); - resultsPanel.add(results, BorderLayout.CENTER); - - resultsButton.addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent evt) { - results.setText(""); - - Iterator iter = eventList.iterator(); - - while (iter.hasNext()) { - LoggingEvent event = (LoggingEvent) iter.next(); - results.setText( - results.getText() - + ((results.getText().length() == 0) ? "" : "\n") - + "level: " - + event.getLevel() - + ", logger: " - + event.getLoggerName() - + " - result: " - + rule.evaluate(event)); - } - } - }); - - getContentPane().add(fieldPanel, BorderLayout.NORTH); - getContentPane().add(resultsPanel, BorderLayout.CENTER); - } - - private void setRule(Rule rule) { - this.rule = rule; - } - - public static void main(String[] args) { - RuleTest test = - new RuleTest( - "level deb ~= blah test == || logger logger[1-3] like && ", - "( ( level ~= deb ) || ( BLAH == test ) ) && logger like logger[1-3]"); - test.pack(); - test.setVisible(true); - } + /** + * UI for demonstrating infix/postfix conversion and expression rule evaluation...work in progress... + * + * Infix to postfix conversion routines and evaluation methods for boolean expressions. + * See http://www.qiksearch.com/articles/cs/infix-postfix/ + * and http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/ + * + * for more information. + * + * @author Scott Deboy <[EMAIL PROTECTED]> + * + */ + Rule rule; + + public RuleTest(String booleanPostFixExpression, String inFixExpression) { + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + getContentPane().setLayout(new BorderLayout()); + + final LoggingEventFieldResolver resolver = + LoggingEventFieldResolver.getInstance(); + + final List eventList = new ArrayList(); + MDC.put("entry1", "123"); + eventList.add( + new LoggingEvent( + "org.apache.log4j.chainsaw", Logger.getLogger("logger1"), + System.currentTimeMillis(), Level.DEBUG, "message1", + new Exception("test"))); + MDC.put("entry2", "test1"); + eventList.add( + new LoggingEvent( + "org.apache.log4j.chainsaw", Logger.getLogger("logger2"), + System.currentTimeMillis(), Level.DEBUG, "message2", + new Exception("test2"))); + eventList.add( + new LoggingEvent( + "org.apache.log4j.net", Logger.getLogger("logger3"), + System.currentTimeMillis(), Level.DEBUG, "message3", + new Exception("test3"))); + + MDC.put("test", "234"); + eventList.add( + new LoggingEvent( + "org.apache.log4j.chainsaw", Logger.getLogger("logger4"), + System.currentTimeMillis(), Level.WARN, "message4", + new Exception("test4"))); + + JPanel fieldPanel = new JPanel(new GridLayout(5, 1)); + + fieldPanel.add( + new JLabel("Enter infix expression to convert to postfix: ")); + + final JTextField inFixTextField = new JTextField(inFixExpression); + fieldPanel.add(inFixTextField); + + JButton inFixButton = new JButton("Convert InFix to PostFix"); + fieldPanel.add(inFixButton); + + JLabel resultsLabel = new JLabel("Results:"); + fieldPanel.add(resultsLabel); + + final JTextField inFixResult = new JTextField(); + fieldPanel.add(inFixResult); + inFixButton.addActionListener( + new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + InFixToPostFix inFixConverter = new InFixToPostFix(); + inFixResult.setText( + inFixConverter.convert(inFixTextField.getText())); + rule = ExpressionRule.getRule(inFixResult.getText(), true); + } + }); + + JPanel resultsPanel = new JPanel(new BorderLayout()); + + JButton resultsButton = + new JButton( + "Evaluate postfix expression against collection of events: "); + resultsPanel.add(resultsButton, BorderLayout.NORTH); + + final JTextArea results = new JTextArea(5, 50); + resultsPanel.add(results, BorderLayout.CENTER); + + resultsButton.addActionListener( + new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + results.setText(""); + + Iterator iter = eventList.iterator(); + + while (iter.hasNext()) { + LoggingEvent event = (LoggingEvent) iter.next(); + Iterator iter2 = event.getMDCKeySet().iterator(); + StringBuffer mdc = new StringBuffer(); + + while (iter2.hasNext()) { + String mdcKey = (String) iter2.next(); + mdc.append(mdcKey); + mdc.append(":"); + mdc.append(event.getMDC(mdcKey)); + } + + results.setText( + results.getText() + + ((results.getText().length() == 0) ? "" : "\n") + "level: " + + event.getLevel() + ", logger: " + event.getLoggerName() + + ", MDC: " + mdc.toString() + " - result: " + + rule.evaluate(event)); + } + } + }); + + getContentPane().add(fieldPanel, BorderLayout.NORTH); + getContentPane().add(resultsPanel, BorderLayout.CENTER); + } + + private void setRule(Rule rule) { + this.rule = rule; + } + + public static void main(String[] args) { + RuleTest test = + new RuleTest( + "level deb ~= BLAH test == || logger logger[1-3] like MDC.entry1 234 >= || && ", + "( ( level ~= deb ) || ( BLAH == test ) ) && ( logger like logger[1-3] || MDC.entry1 >= 234 )"); + test.pack(); + test.setVisible(true); + } } 1.2 +38 -22 jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/InequalityRule.java Index: InequalityRule.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/InequalityRule.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- InequalityRule.java 24 Oct 2003 08:04:03 -0000 1.1 +++ InequalityRule.java 25 Oct 2003 07:52:55 -0000 1.2 @@ -49,28 +49,28 @@ package org.apache.log4j.chainsaw.rule; -import java.util.Stack; - import org.apache.log4j.chainsaw.LoggingEventFieldResolver; import org.apache.log4j.spi.LoggingEvent; +import java.util.Stack; + + /** * A Rule class implementing less than - expects to be able to convert two values to longs. * If the field being evaluated can support inequality evaluation, the appropriate rule is returned. * (For example, if the expression is Level < DEBUG, a LessThanLevelRule is returned). - * + * * @author Scott Deboy <[EMAIL PROTECTED]> */ - class InequalityRule extends AbstractRule { - private static final String LEVEL = "LEVEL"; - + private static final String LEVEL = "LEVEL"; LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance(); String firstParam; String secondParam; String inequalitySymbol; - private InequalityRule(String inequalitySymbol, String firstParam, String secondParam) { + private InequalityRule( + String inequalitySymbol, String firstParam, String secondParam) { this.inequalitySymbol = inequalitySymbol; this.firstParam = firstParam; this.secondParam = secondParam; @@ -79,34 +79,50 @@ static Rule getRule(String inequalitySymbol, Stack stack) { String p1 = stack.pop().toString(); String p2 = stack.pop().toString(); + if (p2.equalsIgnoreCase(LEVEL)) { - //push the value back on the stack and allow the level-specific rule pop values - stack.push(p1); - stack.push(p2); + //push the value back on the stack and allow the level-specific rule pop values + stack.push(p2); + stack.push(p1); - return LevelInequalityRule.getRule(inequalitySymbol, stack); + return LevelInequalityRule.getRule(inequalitySymbol, stack); } else { - System.out.println("get equals op " + p1 + ".." + p2); + System.out.println("get equals op " + p1 + ".." + p2); - return new InequalityRule(inequalitySymbol, p1, p2); + return new InequalityRule(inequalitySymbol, p1, p2); } } - + public boolean evaluate(LoggingEvent event) { - long second = new Long(resolver.getValue(secondParam, event).toString()).longValue(); - long first = new Long(firstParam).longValue(); + long first = 0; + + try { + first = + new Long(resolver.getValue(secondParam, event).toString()).longValue(); + } catch (NumberFormatException nfe) { + return false; + } + + long second = 0; + + try { + second = new Long(firstParam).longValue(); + } catch (NumberFormatException nfe) { + return false; + } boolean result = false; - + if ("<".equals(inequalitySymbol)) { - result = first < second; + result = first < second; } else if (">".equals(inequalitySymbol)) { - result = first > second; - } else if ("<=".equals(inequalitySymbol)){ - result = first <= second; + result = first > second; + } else if ("<=".equals(inequalitySymbol)) { + result = first <= second; } else if (">=".equals(inequalitySymbol)) { - result = first >= second; + result = first >= second; } + System.out.println("result is " + result); return result; 1.6 +35 -31 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- LoggingEventFieldResolver.java 23 Oct 2003 09:32:23 -0000 1.5 +++ LoggingEventFieldResolver.java 25 Oct 2003 07:52:55 -0000 1.6 @@ -49,11 +49,11 @@ package org.apache.log4j.chainsaw; +import org.apache.log4j.spi.LoggingEvent; + import java.util.ArrayList; import java.util.List; -import org.apache.log4j.spi.LoggingEvent; - /** * A singleton helper utility which accepts a field name and a LoggingEvent and returns the @@ -64,25 +64,25 @@ * The only available method is Object getField(String fieldName, LoggingEvent event). * * Here is a description of the mapping of field names in the grammar - * to fields on the logging event. While the getField method returns an Object, the - * individual types returned per field are described here: + * to fields on the logging event. While the getField method returns an Object, the + * individual types returned per field are described here: * - * Field Name Field value (String representation Return type - * LOGGER category name (logger) String - * LEVEL level Level - * CLASS locationInformation's class name String - * FILE locationInformation's file name String - * LINE locationInformation's line number String - * METHOD locationInformation's method name String - * MSG message Object - * NDC NDC String - * EXCEPTION throwable string representation ThrowableInformation - * TIMESTAMP timestamp Long - * THREAD thread String - * MDC.keyName entry in the MDC hashtable Object - * mapped to key 'keyName' - * PROP.keyName entry in the Property hashtable String - * mapped to the key 'keyName' + * Field Name Field value (String representation Return type + * LOGGER category name (logger) String + * LEVEL level Level + * CLASS locationInformation's class name String + * FILE locationInformation's file name String + * LINE locationInformation's line number String + * METHOD locationInformation's method name String + * MSG message Object + * NDC NDC String + * EXCEPTION throwable string representation ThrowableInformation + * TIMESTAMP timestamp Long + * THREAD thread String + * MDC.keyName entry in the MDC hashtable Object + * mapped to key 'keyName' + * PROP.keyName entry in the Property hashtable String + * mapped to the key 'keyName' * 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). @@ -97,7 +97,6 @@ */ public final class LoggingEventFieldResolver { private static final List keywordList = new ArrayList(); - private static final String LOGGER_FIELD = "LOGGER"; private static final String LEVEL_FIELD = "LEVEL"; private static final String CLASS_FIELD = "CLASS"; @@ -111,12 +110,10 @@ private static final String THREAD_FIELD = "THREAD"; private static final String MDC_FIELD = "MDC."; private static final String PROP_FIELD = "PROP."; - private static final String EMPTY_STRING = ""; - private static final LoggingEventFieldResolver resolver = new LoggingEventFieldResolver(); - + private LoggingEventFieldResolver() { keywordList.add(LOGGER_FIELD); keywordList.add(LEVEL_FIELD); @@ -144,7 +141,7 @@ public boolean isField(String fieldName) { return keywordList.contains(fieldName); } - + public Object getValue(String fieldName, LoggingEvent event) { if (fieldName == null) { return EMPTY_STRING; @@ -167,21 +164,28 @@ } else if (MSG_FIELD.equals(upperField)) { return event.getMessage(); } else if (NDC_FIELD.equals(upperField)) { - return event.getNDC(); + String ndcValue = event.getNDC(); + + return ((ndcValue == null) ? "" : ndcValue); } else if (EXCEPTION_FIELD.equals(upperField)) { - return event.getThrowableInformation(); + return event.getThrowableInformation(); } else if (TIMESTAMP_FIELD.equals(upperField)) { return new Long(event.timeStamp); } else if (THREAD_FIELD.equals(upperField)) { return event.getThreadName(); } else if (upperField.startsWith(MDC_FIELD)) { //note: need to use actual fieldname since case matters - return event.getMDC(fieldName.substring(4)); + Object mdcValue = event.getMDC(fieldName.substring(4)); + + return ((mdcValue == null) ? "" : mdcValue.toString()); } else if (upperField.startsWith(PROP_FIELD)) { - //note: need to use actual fieldname since case matters - return event.getProperty(fieldName.substring(5)); + //note: need to use actual fieldname since case matters + String propValue = event.getProperty(fieldName.substring(5)); + + return ((propValue == null) ? "" : propValue); } - //there wasn't a match, so just return the passed-in name + + //there wasn't a match, so just return the passed-in name return fieldName; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]