From 81b237672cf1b02e0d44e870dcf5e963bdf47617 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 31 Mar 2016 21:11:21 +0200 Subject: [PATCH] ongoing work, does not compile --- .../src/main/java/org/slf4j/LoggerFactory.java | 17 +++++++++++++++-- .../org/slf4j/helpers/SubstituteLogger.java | 14 ++++++++++++-- .../slf4j/helpers/SubstituteLoggerFactory.java | 2 ++ .../java/org/slf4j/LoggerAccessingThread.java | 1 + .../JDK14MultithreadedInitializationTest.java | 5 ++--- ...leLoggerMultithreadedInitializationTest.java | 5 ++--- slf4j-site/src/site/pages/news.html | 9 +++++++++ 7 files changed, 43 insertions(+), 10 deletions(-) diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java index 84928cf39..bcea65e63 100755 --- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java @@ -183,6 +183,20 @@ static void failedBinding(Throwable t) { Util.report("Failed to instantiate SLF4J LoggerFactory", t); } + private final static void fixSubstitutedLoggers() { + List loggers = SUBST_FACTORY.getLoggers(); + + if (loggers.isEmpty()) { + return; + } + + for (SubstituteLogger subLogger : loggers) { + Logger logger = getLogger(subLogger.getName()); + subLogger.setDelegate(logger); + } + + SUBST_FACTORY.clear(); + } private static void replayEvents() { final LinkedBlockingQueue queue = SUBST_FACTORY.getEventQueue(); final int queueSize = queue.size(); @@ -219,8 +233,7 @@ private static void replaySingleEvent(SubstituteLoggingEvent event) { SubstituteLogger substLogger = event.getLogger(); String loggerName = substLogger.getName(); if (substLogger.isDelegateNull()) { - Logger logger = getLogger(loggerName); - substLogger.setDelegate(logger); + throw new IllegalStateException("Delegate logger cannot be null at this state."); } if (substLogger.isDelegateNOP()) { diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java index 76eda17a0..3ac0d32b5 100644 --- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java +++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java @@ -53,9 +53,12 @@ public class SubstituteLogger implements Logger { private EventRecodingLogger eventRecodingLogger; private Queue eventQueue; - public SubstituteLogger(String name, Queue eventQueue) { + private final boolean createdPostInitialization; + + public SubstituteLogger(String name, Queue eventQueue, boolean createdPostInitialization) { this.name = name; this.eventQueue = eventQueue; + this.createdPostInitialization = createdPostInitialization; } public String getName() { @@ -327,7 +330,14 @@ public int hashCode() { * instance. */ Logger delegate() { - return _delegate != null ? _delegate : getEventRecordingLogger(); + if(_delegate != null) { + return _delegate; + } + if(createdPostInitialization) { + return NOPLogger.NOP_LOGGER; + } else { + return getEventRecordingLogger(); + } } private Logger getEventRecordingLogger() { diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java index cbd67ae70..321e49b68 100755 --- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java @@ -42,6 +42,8 @@ */ public class SubstituteLoggerFactory implements ILoggerFactory { + boolean postInitialization = false; + final ConcurrentMap loggers = new ConcurrentHashMap(); final LinkedBlockingQueue eventQueue = new LinkedBlockingQueue(); diff --git a/slf4j-api/src/test/java/org/slf4j/LoggerAccessingThread.java b/slf4j-api/src/test/java/org/slf4j/LoggerAccessingThread.java index ca1d6a5f0..b3e36ee57 100755 --- a/slf4j-api/src/test/java/org/slf4j/LoggerAccessingThread.java +++ b/slf4j-api/src/test/java/org/slf4j/LoggerAccessingThread.java @@ -50,6 +50,7 @@ public void run() { String loggerNamePrefix = this.getClass().getName(); for (int i = 0; i < LOOP_LEN; i++) { Logger logger = LoggerFactory.getLogger(loggerNamePrefix + "-" + count + "-" + i); + Thread.yield(); logger.info("in run method"); eventCount.getAndIncrement(); } diff --git a/slf4j-jdk14/src/test/java/org/slf4j/impl/JDK14MultithreadedInitializationTest.java b/slf4j-jdk14/src/test/java/org/slf4j/impl/JDK14MultithreadedInitializationTest.java index 80d22b8dc..70c20487f 100755 --- a/slf4j-jdk14/src/test/java/org/slf4j/impl/JDK14MultithreadedInitializationTest.java +++ b/slf4j-jdk14/src/test/java/org/slf4j/impl/JDK14MultithreadedInitializationTest.java @@ -24,7 +24,7 @@ */ package org.slf4j.impl; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.Random; @@ -82,8 +82,7 @@ public void multiThreadedInitialization() throws InterruptedException, BrokenBar eventCount.getAndIncrement(); long recordedEventCount = getRecordedEventCount(); - assertTrue(eventCount.get() + " >= " + recordedEventCount, eventCount.get() >= recordedEventCount); - assertTrue(eventCount.get() + " < " + recordedEventCount + "+10", eventCount.get() < recordedEventCount + 10); + assertEquals(eventCount.get(), recordedEventCount); } private long getRecordedEventCount() { diff --git a/slf4j-simple/src/test/java/org/slf4j/impl/SimpleLoggerMultithreadedInitializationTest.java b/slf4j-simple/src/test/java/org/slf4j/impl/SimpleLoggerMultithreadedInitializationTest.java index dbb7194a0..149550ec6 100755 --- a/slf4j-simple/src/test/java/org/slf4j/impl/SimpleLoggerMultithreadedInitializationTest.java +++ b/slf4j-simple/src/test/java/org/slf4j/impl/SimpleLoggerMultithreadedInitializationTest.java @@ -24,7 +24,7 @@ */ package org.slf4j.impl; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import java.io.PrintStream; import java.util.ArrayList; @@ -84,8 +84,7 @@ public void multiThreadedInitialization() throws InterruptedException, BrokenBar long expected = eventCount.get() + NUM_LINES_IN_SLF4J_REPLAY_WARNING; int actual = sps.stringList.size(); - assertTrue(expected + " >= " + actual, expected >= actual); - assertTrue(expected + " < " + actual + " + 16", expected < actual + 16); + assertEquals(expected, actual); } private LoggerAccessingThread[] harness() throws InterruptedException, BrokenBarrierException { diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index 78cea310b..bd8a74edd 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -33,6 +33,15 @@

SLF4J News


+

xxx April, 2016 - Release of SLF4J 1.7.21

+ +

LoggerFactory makes sure to release all resources + referenced by SubstituteLoggerFactory post-initialization. See also + SLF4J-366 +

+ +
+

March 29th, 2016 - Release of SLF4J 1.7.20

Fixed initialization problem encountered on the Google App