diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java index 01a4fb45..fb45ec26 100755 --- a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java +++ b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java @@ -67,8 +67,21 @@ public final class Util { } } - private static final ClassContextSecurityManager SECURITY_MANAGER = safeCreateSecurityManager(); - + private static ClassContextSecurityManager SECURITY_MANAGER; + private static boolean SECURITY_MANAGER_CREATION_ALREADY_ATTEMPTED = false; + + private static ClassContextSecurityManager getSecurityManager() { + if(SECURITY_MANAGER != null) + return SECURITY_MANAGER; + else if(SECURITY_MANAGER_CREATION_ALREADY_ATTEMPTED) + return null; + else { + SECURITY_MANAGER = safeCreateSecurityManager(); + SECURITY_MANAGER_CREATION_ALREADY_ATTEMPTED = true; + return SECURITY_MANAGER; + } + } + private static ClassContextSecurityManager safeCreateSecurityManager() { try { return new ClassContextSecurityManager(); @@ -83,9 +96,10 @@ public final class Util { * @return the name of the class which called the invoking method. */ public static Class getCallingClass() { - if(SECURITY_MANAGER == null) + ClassContextSecurityManager securityManager = getSecurityManager(); + if(securityManager == null) return null; - Class[] trace = SECURITY_MANAGER.getClassContext(); + Class[] trace = securityManager.getClassContext(); String thisClassName = Util.class.getName(); // Advance until Util is found diff --git a/slf4j-simple/src/test/java/org/slf4j/DetectLoggerNameMismatchTest.java b/slf4j-simple/src/test/java/org/slf4j/DetectLoggerNameMismatchTest.java index c6c6f205..fd1b83d1 100755 --- a/slf4j-simple/src/test/java/org/slf4j/DetectLoggerNameMismatchTest.java +++ b/slf4j-simple/src/test/java/org/slf4j/DetectLoggerNameMismatchTest.java @@ -80,6 +80,7 @@ public class DetectLoggerNameMismatchTest { public void testTriggerWithProperty() { setTrialEnabled(true); LoggerFactory.getLogger(String.class); + String s = String.valueOf(byteArrayOutputStream); assertMismatchDetected(true); } @@ -90,8 +91,9 @@ public class DetectLoggerNameMismatchTest { public void testTriggerWholeMessage() { setTrialEnabled(true); LoggerFactory.getLogger(String.class); - assertTrue("Actual value of byteArrayOutputStream: " + String.valueOf(byteArrayOutputStream), String.valueOf(byteArrayOutputStream).contains( - "Detected logger name mismatch. Given name: \"java.lang.String\"; " + "computed name: \"org.slf4j.DetectLoggerNameMismatchTest\".")); + boolean success = String.valueOf(byteArrayOutputStream).contains( + "Detected logger name mismatch. Given name: \"java.lang.String\"; " + "computed name: \"org.slf4j.DetectLoggerNameMismatchTest\"."); + assertTrue("Actual value of byteArrayOutputStream: " + String.valueOf(byteArrayOutputStream), success); } /* diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index 88d12eb4..d7c496c4 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -29,7 +29,15 @@
-

, 2015 - Release of SLF4J 1.7.13

+

10th of November, 2015 - Release of SLF4J 1.7.13

+ + +

Fixed LoggerFactory initialisation problem in + presence of SecurityManager denying "createSecurityManage"r + RuntimePermission. See SLF4J-324 for + further details. +

Fixed issue with BasicMDCAdapter leaking MDC information to non-child threads. This problem was reported by