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

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Oct 2 16:36:49 EDT 2014


Merged, thanks!

Mathieu

----- Original Message -----
> From: "Christian Babeux" <christian.babeux at efficios.com>
> To: "mathieu desnoyers" <mathieu.desnoyers at efficios.com>
> Cc: lttng-dev at lists.lttng.org, "Christian Babeux" <christian.babeux at efficios.com>
> 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 <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
> 
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list