sdeboy      2004/09/12 22:03:44

  Modified:    src/java/org/apache/log4j/chainsaw/receivers
                        ReceiversHelper.java
               src/java/org/apache/log4j/varia LogFilePatternReceiver.java
  Log:
  - receivershelper now printing a warning when class not found - no stack trace 
printed
  - improved matching of fields in logfilepatternreceiver:
    avoiding greedy matches on all fields except the MESSAGE field
    timestamp pattern matching improved
    corrected a bug in exception/multi-line message building
  
  Revision  Changes    Path
  1.7       +2 -2      
logging-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
  
  Index: ReceiversHelper.java
  ===================================================================
  RCS file: 
/home/cvs/logging-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ReceiversHelper.java      17 Jun 2004 00:15:26 -0000      1.6
  +++ ReceiversHelper.java      13 Sep 2004 05:03:44 -0000      1.7
  @@ -68,8 +68,8 @@
                        Class receiverClass = classLoader.loadClass(line);
                        receiverClassList.add(receiverClass);
                        LogLog.debug("Located known Receiver class " + 
receiverClass.getName());
  -             } catch (Exception e) {
  -                     LogLog.error("Failed to locate Receiver class:" + line, e);
  +             } catch (ClassNotFoundException e) {
  +                     LogLog.warn("Failed to locate Receiver class:" + line);
                }
                catch (NoClassDefFoundError e) {
                        LogLog.error("Failed to locate Receiver class:" + line + ", 
looks like a dependent class is missing from the classpath", e);
  
  
  
  1.19      +38 -12    
logging-log4j/src/java/org/apache/log4j/varia/LogFilePatternReceiver.java
  
  Index: LogFilePatternReceiver.java
  ===================================================================
  RCS file: 
/home/cvs/logging-log4j/src/java/org/apache/log4j/varia/LogFilePatternReceiver.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- LogFilePatternReceiver.java       10 Sep 2004 21:20:08 -0000      1.18
  +++ LogFilePatternReceiver.java       13 Sep 2004 05:03:44 -0000      1.19
  @@ -152,9 +152,11 @@
     
     //all lines other than first line of exception begin with tab followed by 'at' 
followed by text
     private static final String EXCEPTION_PATTERN = "\tat.*";
  -  private static final String REGEXP_WILDCARD = ".*";
  +  private static final String REGEXP_DEFAULT_WILDCARD = ".*?";
  +  private static final String REGEXP_GREEDY_WILDCARD = ".+";
     private static final String PATTERN_WILDCARD = "*";
  -  private static final String GROUP = "(" + REGEXP_WILDCARD + ")";
  +  private static final String DEFAULT_GROUP = "(" + REGEXP_DEFAULT_WILDCARD + ")";
  +  private static final String GREEDY_GROUP = "(" + REGEXP_GREEDY_WILDCARD + ")";
   
     private static final String HOSTNAME_PROPERTY_VALUE = "file";
   
  @@ -171,14 +173,17 @@
     private String filterExpression;
   
     private final Perl5Util util = new Perl5Util();
  -  private final Perl5Compiler compiler = new Perl5Compiler();
  -  private final Perl5Matcher matcher = new Perl5Matcher();
  +  private final Perl5Compiler exceptionCompiler = new Perl5Compiler();
  +  private final Perl5Matcher exceptionMatcher = new Perl5Matcher();
  +  private static final String VALID_DATEFORMAT_CHAR_PATTERN = 
"[GyMwWDdFEaHkKhmsSzZ]";
   
     private Rule expressionRule;
     private final Map currentMap = new HashMap();
     private final List additionalLines = new ArrayList();
     private String regexp;
     private Reader reader;
  +  private Set greedyKeywords = new HashSet();
  +  private String timestampPatternText;
   
     public LogFilePatternReceiver() {
       keywords.add(TIMESTAMP);
  @@ -191,6 +196,8 @@
       keywords.add(METHOD);
       keywords.add(MESSAGE);
       keywords.add(NDC);
  +    
  +    greedyKeywords.add(MESSAGE);
     }
   
     /**
  @@ -300,9 +307,9 @@
      */
     private int getExceptionLine() {
       try {
  -      Pattern exceptionPattern = compiler.compile(EXCEPTION_PATTERN);
  +      Pattern exceptionPattern = exceptionCompiler.compile(EXCEPTION_PATTERN);
         for (int i = 0; i < additionalLines.size(); i++) {
  -        if (matcher.matches((String) additionalLines.get(i), exceptionPattern)) {
  +        if (exceptionMatcher.matches((String) additionalLines.get(i), 
exceptionPattern)) {
             return i - 1;
           }
         }
  @@ -329,8 +336,9 @@
         return firstMessageLine;
       }
       StringBuffer message = new StringBuffer(firstMessageLine);
  +    int linesToProcess = (exceptionLine == -1?additionalLines.size(): 
exceptionLine);
   
  -    for (int i = 0; i < exceptionLine; i++) {
  +    for (int i = 0; i < linesToProcess; i++) {
         message.append(newLine);
         message.append(additionalLines.get(i));
       }
  @@ -401,6 +409,7 @@
     private void process(Reader unbufferedReader) throws IOException {
       BufferedReader bufferedReader = new BufferedReader(unbufferedReader);
   
  +    Perl5Compiler compiler = new Perl5Compiler();
       Pattern regexpPattern = null;
       try {
         regexpPattern = compiler.compile(regexp);
  @@ -410,6 +419,7 @@
   
       Perl5Matcher eventMatcher = new Perl5Matcher(); 
       String line = null;
  +    LogLog.debug("tailing file: " + tailing);
       do {
         while ((line = bufferedReader.readLine()) != null) {
           if (eventMatcher.matches(line, regexpPattern)) {
  @@ -432,6 +442,7 @@
           if (passesExpression(event)) {
             doPost(event);
           }
  +        LogLog.debug("no further lines to process in " + fileURL);
         }
         try {
           synchronized (this) {
  @@ -440,7 +451,7 @@
         } catch (InterruptedException ie) {
         }
       } while (tailing);
  -
  +    LogLog.debug("processing " + fileURL + " complete");
       shutdown();
     }
   
  @@ -476,6 +487,16 @@
       }
       return map;
     }
  +  
  +  /**
  +   * Helper method that will convert timestamp format to a pattern
  +   * 
  +   * 
  +   * @return string
  +   */
  +  private String convertTimestamp() {
  +    return util.substitute("s/"+VALID_DATEFORMAT_CHAR_PATTERN+"/\\\\w/g", 
timestampFormat);
  +  }
   
     /**
      * Build the regular expression needed to parse log entries
  @@ -484,6 +505,7 @@
     private void initialize() {
       if (timestampFormat != null) {
         dateFormat = new SimpleDateFormat(timestampFormat);
  +      timestampPatternText = convertTimestamp();
       }
   
       try {
  @@ -521,7 +543,7 @@
       }
   
       newPattern = replaceMetaChars(newPattern);
  -    newPattern = replace(PATTERN_WILDCARD, REGEXP_WILDCARD, newPattern);
  +    newPattern = replace(PATTERN_WILDCARD, REGEXP_DEFAULT_WILDCARD, newPattern);
   
       /*
        * we're using a treemap, so the index will be used as the key to ensure
  @@ -551,9 +573,14 @@
       Iterator iter2 = matchingKeywords.iterator();
       while (iter2.hasNext()) {
         String keyword = (String) iter2.next();
  -      currentPattern = replace(keyword, GROUP, currentPattern);
  +      if (TIMESTAMP.equals(keyword)) {
  +        currentPattern = replace(keyword, "(" + timestampPatternText + ")", 
currentPattern);
  +      } else {
  +        currentPattern = replace(keyword, 
greedyKeywords.contains(keyword)?GREEDY_GROUP:DEFAULT_GROUP, currentPattern);
  +      }
       }
       regexp = currentPattern;
  +    LogLog.debug("regexp is " + regexp);
     }
   
     /**
  @@ -678,7 +705,6 @@
       event.setLocationInformation(info);
       event.setNDC(ndc);
       event.setProperties(properties);
  -
       return event;
     }
   
  @@ -687,7 +713,7 @@
       LogFilePatternReceiver test = new LogFilePatternReceiver();
       test.setLogFormat("TIMESTAMP LEVEL [THREAD] LOGGER (FILE:LINE) - MESSAGE");
       test.setTailing(true);
  -    test.setFileURL("file:///C:/downloads/workspace/test/test2.log");
  +    test.setFileURL("file:///C:/log/test.log");
       test.initialize();
       try {
         test.process(new InputStreamReader(new URL(test.getFileURL())
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to