Merged, thanks! Mathieu
----- Original Message ----- > From: "Christian Babeux" <[email protected]> > To: "mathieu desnoyers" <[email protected]> > Cc: [email protected], "Christian Babeux" > <[email protected]> > Sent: Thursday, October 2, 2014 4:31:56 PM > Subject: [PATCH] Fix: Abort loading log4j agent classes when detected log4j > version is too old > > 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 <[email protected]> > --- > .../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 > > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
