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]