Okay, I'm now able to successfully compile Chainsaw with only some minor changes (more on that later). The preliminaries are pretty brutal at the moment, but hopefully they will get better as we decide how to package these things. To build Chainsaw on log4j 1.2.x, you need

log4j-1.2.15.jar built from SVN
apache-log4j-component-0.1-SNAPSHOT.jar
apache-log4j-expression-filters-0.1-SNAPSHOT.jar
apache-log4j-receivers-0.1-SNAPSHOT.jar

The first you build as always. The next two are build using Maven and build against log4j 1.2.14 and should work, but haven't been tested in any manner, with earlier log4j 1.2 jars. To build these (adjust as appropriate for your platform), each step assumes that you've changed back to the base directory after the previous step:

Download and install Maven 2.0.4 or later
Open command shell
Place maven-2.0.4/bin on path

Checkout sandbox projects (where PROJECT is component, expression- filter or receivers) using svn co https://svn.apache.org/repos/asf/logging/sandbox/log4j/ PROJECT

Build and install expression-filter project
  cd expression-filter; mvn install

Build and install (into local Maven repo) component project:
  cd component; mvn install

Kludge an install of the freshly build log4j-1.2.15 into the local maven repo
  cd ~/.m2/repository/log4j/log4j
  mkdir 1.2.15
  cd 1.2.15
  # copy existing log4j-1.2.14.pom, but change version number
  sed s/1.2.14/1.2.15/ ../1.2.14/log4j-1.2.14.pom > log4j-1.2.15.pom
  # copy log4j-1.2.15.jar into same location

Build and install receivers

  cd receivers; mvn install

Replace log4j-1.3alpha-8.jar in chainsaw.lib with log4j-1.2.15.jar and the three generated apache-log4j-*.jars (located in the target subdirectory of each project).

Apply patch described below and build as normal


The following patch should allow chainsaw to build either against the SVN head of log4j 1.3 or the 1.2 recipe described above:

Index: src/java/org/apache/log4j/chainsaw/LogUI.java
===================================================================
--- src/java/org/apache/log4j/chainsaw/LogUI.java       (revision 527248)
+++ src/java/org/apache/log4j/chainsaw/LogUI.java       (working copy)
@@ -103,7 +103,7 @@
 import org.apache.log4j.chainsaw.receivers.ReceiversPanel;
 import org.apache.log4j.chainsaw.version.VersionManager;
 import org.apache.log4j.helpers.Constants;
-import org.apache.log4j.joran.JoranConfigurator;
+import org.apache.log4j.xml.DOMConfigurator;
 import org.apache.log4j.net.SocketNodeEventListener;
 import org.apache.log4j.plugins.Plugin;
 import org.apache.log4j.plugins.PluginEvent;
@@ -1888,8 +1888,7 @@
             try {
// we temporarily swap the TCCL so that plugins can find resources Thread.currentThread().setContextClassLoader (classLoader);
-              JoranConfigurator jc = new JoranConfigurator();
-              jc.doConfigure(url, LogManager.getLoggerRepository());
+              DOMConfigurator.configure(url);
             }finally{
                 // now switch it back...
Thread.currentThread().setContextClassLoader (previousTCCL);
Index: src/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
===================================================================
--- src/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java (revision 527248) +++ src/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java (working copy)
@@ -190,16 +190,15 @@
         li = formatLocationInfo(event);
     }
     Hashtable properties = formatProperties(event);
-    LoggingEvent copy = new LoggingEvent();
-    copy.setLogger(logger);
-    copy.setTimeStamp(event.getTimeStamp());
-    copy.setLevel(event.getLevel());
-    copy.setThreadName(threadName);
-    copy.setMessage(msg);
-    copy.setNDC(ndc);
-    copy.setThrowableInformation(event.getThrowableInformation());
-    copy.setLocationInformation(li);
-    copy.setProperties(properties);
+    LoggingEvent copy = new LoggingEvent(null,
+          logger, event.getTimeStamp(),
+          event.getLevel(),
+          msg,
+          threadName,
+          event.getThrowableInformation(),
+          ndc,
+          li,
+          properties);

     return copy;
   }
Index: src/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
===================================================================
--- src/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java (revision 527248) +++ src/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java (working copy)
@@ -181,16 +181,16 @@

ThrowableInformation tsr = new ThrowableInformation(new Exception());

-    event = new LoggingEvent();
-    event.setLogger(Logger.getLogger("com.mycompany.mylogger"));
-    event.setTimeStamp(new Date().getTime());
-    event.setLevel(org.apache.log4j.Level.DEBUG);
-    event.setThreadName("Thread-1");
-    event.setMessage("The quick brown fox jumped over the lazy dog");
-    event.setNDC("NDC string");
-    event.setThrowableInformation(tsr);
-    event.setLocationInformation(li);
-    event.setProperties(hashTable);
+    event = new LoggingEvent("org.apache.log4j.Logger",
+           Logger.getLogger("com.mycompany.mylogger"),
+               new Date().getTime(),
+               org.apache.log4j.Level.DEBUG,
+               "The quick brown fox jumped over the lazy dog",
+               "Thread-1",
+               tsr,
+               "NDC string",
+               li,
+               hashTable);

   }



Basically, an equivalent DOMConfigurator method is used to replace a call to JoranConfigurator and a call to the LoggingEvent constructor newly added to both log4j 1.2.x and log4j 1.3 replaces the default construction of LoggingEvent and subsequent mutator calls. Duplicating the LoggingEvent mutators would have required removing "final" qualifiers from most members of LoggingEvent which was a more substantial change than I wanted to do in 1.2.x.

I haven't had any success actually starting Chainsaw either against log4j 1.2.x or 1.3. So I'd appreciate feedback or fixes to anything that I didn't get right. I've now delayed income tax preparation by several days and will now start working on that with a vengeance and will not take offense if anyone wants to fix things directly in the SVN.

Hopefully the expression-filter project is usable with deployed versions of log4j 1.2. Any feedback on that would also be appreciated.

If anyone wants to add documentation, write test cases, or port test cases over from log4j 1.3, more power to you.

For more info on Maven 2, you can download "Better Builds With Maven" from http://www.mergere.com/m2book_download.jsp

Reply via email to