[lttng-dev] [PATCH] Fix: Abort loading log4j agent classes when detected log4j version is too old

Christian Babeux christian.babeux at efficios.com
Thu Oct 2 16:31:56 EDT 2014


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 at efficios.com>
---
 .../java/org/lttng/ust/agent/LTTngAgent.java       | 38 ++++++++++++++++++----
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/liblttng-ust-java-agent/java/org/lttng/ust/agent/LTTngAgent.java b/liblttng-ust-java-agent/java/org/lttng/ust/agent/LTTngAgent.java
index 342ccfa..293ac84 100644
--- a/liblttng-ust-java-agent/java/org/lttng/ust/agent/LTTngAgent.java
+++ b/liblttng-ust-java-agent/java/org/lttng/ust/agent/LTTngAgent.java
@@ -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() {
-- 
2.1.1




More information about the lttng-dev mailing list