Fix: Abort loading log4j agent classes when detected log4j version is too old
authorChristian Babeux <christian.babeux@efficios.com>
Thu, 2 Oct 2014 20:31:56 +0000 (16:31 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 2 Oct 2014 20:36:14 +0000 (16:36 -0400)
The Java Log4j agent rely on the getTimeStamp() method that was
introduced in log4j 1.2.15. This fix implement a runtime detection of
the log4j library capabilities and abort the loading of the relevant
agent classes if the version used is too old.

Thus, log4j tracing will be deactivated on older version of the
library.

Signed-off-by: Christian Babeux <christian.babeux@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust-java-agent/java/org/lttng/ust/agent/LTTngAgent.java

index 342ccfae15c0c0bb45c29291c2f236bc2e60d9fc..293ac848fba937fa79d40113f871344f8bec7595 100644 (file)
@@ -29,7 +29,6 @@ import java.util.Enumeration;
 import java.lang.reflect.InvocationTargetException;
 
 import java.util.logging.Logger;
-import java.util.logging.FileHandler;;
 import java.util.logging.SimpleFormatter;
 
 public class LTTngAgent {
@@ -92,17 +91,44 @@ public class LTTngAgent {
        }
 
        private Boolean loadLog4jClasses() {
-               Boolean loaded = false;
+               Class<?> logging;
+
                try {
                        ClassLoader loader = ClassLoader.getSystemClassLoader();
-                       loader.loadClass("org.apache.log4j.Logger");
-                       loaded = true;
+                       logging = loader.loadClass("org.apache.log4j.spi.LoggingEvent");
                } catch (ClassNotFoundException e) {
                        /* Log4j classes not found, no need to create the relevant objects */
-                       loaded = false;
+                       return false;
+               }
+
+               /*
+                * Detect capabilities of the log4j library. We only
+                * support log4j >= 1.2.15.  The getTimeStamp() method
+                * was introduced in log4j 1.2.15, so verify that it
+                * is available.
+                *
+                * We can't rely on the getPackage().getImplementationVersion()
+                * call that would retrieves information from the manifest file
+                * found in the JAR since the manifest file shipped
+                * from upstream is known to be broken in several
+                * versions of the library.
+                *
+                * More info:
+                * https://issues.apache.org/bugzilla/show_bug.cgi?id=44370
+                */
+
+               try {
+                       logging.getDeclaredMethod("getTimeStamp");
+               } catch (NoSuchMethodException e) {
+                       return false;
+               } catch (NullPointerException e) {
+                       /* Should never happen */
+                       return false;
+               } catch (SecurityException e) {
+                       return false;
                }
 
-               return loaded;
+               return true;
        }
 
        private void initAgentJULClasses() {
This page took 0.037838 seconds and 4 git commands to generate.