Hi, I've been using a recent trunk version of chainsaw to look at log files created with log4j's org.apache.log4j.xml.XMLLayout layout. I noticed that when I configure a LogFileXMLReceiver to open a log file from a well-known location that the imported events do not contain a 'hostname' or 'application' property. This, of course, plays havoc with event routing.
A bit of investigation showed that when a log file is opened that the FileLoadAction class uses the 'setAdditionalProperties' method on the decoder to add the file and path as the host and application properties. This doesn't happen when configuring a LogFileXMLReceiver directly. When I looked at the LogFileXMLReceiver code I saw that it contains the following logic (for each event): if (evt.getProperty(Constants.HOSTNAME_KEY) != null) { evt.setProperty(Constants.HOSTNAME_KEY, host); } if (evt.getProperty(Constants.APPLICATION_KEY) != null) { evt.setProperty(Constants.APPLICATION_KEY, path); } This has the effect of setting the hostname and application properties of the event to the string "file" and the file path of the configured source URL, but only if the event being processed contained "hostname" and "application" properties. This behavior seems somewhat strange... if I've gone to the trouble of setting the 'hostname' and 'application' properties in the log, I'd expect them to be used. The following patch changes this behavior as follows: (1) The event will always have a 'hostname' and 'application' property. (2) The default value of the hostname property is 'file'. (3) The default value of the application property is the path to the log file. (4) If an event includes a 'hostname' or 'application' property it will override the corresponding default value. The end result of this change is that files configured with LogFileXMLReceiver act, by default, as if they were opened directly (i.e., they use the 'file' URL information for routing). If the generating application adds 'application' or 'hostname' properties to the logged events, however, those properties will be used for routing. I hope you find this useful. -- Jim Mayer -------------------- START OF DIFF ------------------ Index: src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java =================================================================== --- src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java (revision 1397548) +++ src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java (working copy) @@ -276,12 +276,17 @@ for (Iterator iter = c.iterator(); iter.hasNext();) { LoggingEvent evt = (LoggingEvent) iter.next(); if (passesExpression(evt)) { - if (evt.getProperty(Constants.HOSTNAME_KEY) != null) { - evt.setProperty(Constants.HOSTNAME_KEY, host); + String theHost = host; + String theApp = path; + String v; + if ((v = evt.getProperty(Constants.HOSTNAME_KEY)) != null) { + theHost = v; } - if (evt.getProperty(Constants.APPLICATION_KEY) != null) { - evt.setProperty(Constants.APPLICATION_KEY, path); + if ((v = evt.getProperty(Constants.APPLICATION_KEY)) != null) { + theApp = v; } + evt.setProperty(Constants.HOSTNAME_KEY, theHost); + evt.setProperty(Constants.APPLICATION_KEY, theApp); doPost(evt); } } @@ -307,4 +312,4 @@ this.useCurrentThread = useCurrentThread; } -} \ No newline at end of file +} ------------------- END OF DIFF ---------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-dev-h...@logging.apache.org