11/**
22 * Logback: the reliable, generic, fast and flexible logging framework.
33 * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4- *
4+ * <p>
55 * This program and the accompanying materials are dual-licensed under
66 * either the terms of the Eclipse Public License v1.0 as published by
77 * the Eclipse Foundation
8- *
9- * or (per the licensee's choosing)
10- *
8+ * <p>
9+ * or (per the licensee's choosing)
10+ * <p>
1111 * under the terms of the GNU Lesser General Public License version 2.1
1212 * as published by the Free Software Foundation.
1313 */
2323import java .util .Map ;
2424import java .util .concurrent .ConcurrentHashMap ;
2525import java .util .concurrent .ScheduledFuture ;
26+ import java .util .concurrent .locks .ReentrantLock ;
2627
2728import ch .qos .logback .classic .util .LogbackMDCAdapter ;
2829import ch .qos .logback .core .status .ErrorStatus ;
5758 */
5859public class LoggerContext extends ContextBase implements ILoggerFactory , LifeCycle {
5960
60- /** Default setting of packaging data in stack traces */
61+ /**
62+ * Default setting of packaging data in stack traces
63+ */
6164 public static final boolean DEFAULT_PACKAGING_DATA = false ;
6265
6366 final Logger root ;
@@ -74,7 +77,6 @@ public class LoggerContext extends ContextBase implements ILoggerFactory, LifeCy
7477
7578 MDCAdapter mdcAdapter ;
7679
77-
7880 private int maxCallerDataDepth = ClassicConstants .DEFAULT_MAX_CALLEDER_DATA_DEPTH ;
7981
8082 int resetCount = 0 ;
@@ -91,6 +93,10 @@ public LoggerContext() {
9193 initEvaluatorMap ();
9294 size = 1 ;
9395 this .frameworkPackages = new ArrayList <String >();
96+ // In 1.5.7, the stop() method assumes that at some point the context has been started
97+ // since earlier versions of logback did not mandate calling the start method
98+ // we need to call in the constructor
99+ this .start ();
94100 }
95101
96102 void initEvaluatorMap () {
@@ -117,8 +123,6 @@ public void setName(String name) {
117123 updateLoggerContextVO ();
118124 }
119125
120-
121-
122126 public final Logger getLogger (final Class <?> clazz ) {
123127 return getLogger (clazz .getName ());
124128 }
@@ -194,9 +198,7 @@ public Logger exists(String name) {
194198
195199 final void noAppenderDefinedWarning (final Logger logger ) {
196200 if (noAppenderWarning ++ == 0 ) {
197- getStatusManager ().add (new WarnStatus (
198- "No appenders present in context [" + getName () + "] for logger [" + logger .getName () + "]." ,
199- logger ));
201+ getStatusManager ().add (new WarnStatus ("No appenders present in context [" + getName () + "] for logger [" + logger .getName () + "]." , logger ));
200202 }
201203 }
202204
@@ -219,17 +221,24 @@ public boolean isPackagingDataEnabled() {
219221 return packagingDataEnabled ;
220222 }
221223
222- private void cancelScheduledTasks () {
223- for (ScheduledFuture <?> sf : scheduledFutures ) {
224- sf .cancel (false );
224+ void cancelScheduledTasks () {
225+
226+ try {
227+ configurationLock .lock ();
228+
229+ for (ScheduledFuture <?> sf : scheduledFutures ) {
230+ sf .cancel (false );
231+ }
232+ scheduledFutures .clear ();
233+ } finally {
234+ configurationLock .unlock ();
225235 }
226- scheduledFutures .clear ();
227236 }
228237
229238 private void resetStatusListenersExceptResetResistant () {
230239 StatusManager sm = getStatusManager ();
231240 for (StatusListener sl : sm .getCopyOfStatusListenerList ()) {
232- if (!sl .isResetResistant ()) {
241+ if (!sl .isResetResistant ()) {
233242 sm .remove (sl );
234243 }
235244 }
@@ -254,29 +263,28 @@ public void resetTurboFilterList() {
254263 turboFilterList .clear ();
255264 }
256265
257- final FilterReply getTurboFilterChainDecision_0_3OrMore (final Marker marker , final Logger logger , final Level level ,
258- final String format , final Object [] params , final Throwable t ) {
266+ final FilterReply getTurboFilterChainDecision_0_3OrMore (final Marker marker , final Logger logger , final Level level , final String format ,
267+ final Object [] params , final Throwable t ) {
259268 if (turboFilterList .size () == 0 ) {
260269 return FilterReply .NEUTRAL ;
261270 }
262271 return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format , params , t );
263272 }
264273
265- final FilterReply getTurboFilterChainDecision_1 (final Marker marker , final Logger logger , final Level level ,
266- final String format , final Object param , final Throwable t ) {
274+ final FilterReply getTurboFilterChainDecision_1 (final Marker marker , final Logger logger , final Level level , final String format , final Object param ,
275+ final Throwable t ) {
267276 if (turboFilterList .size () == 0 ) {
268277 return FilterReply .NEUTRAL ;
269278 }
270279 return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format , new Object [] { param }, t );
271280 }
272281
273- final FilterReply getTurboFilterChainDecision_2 (final Marker marker , final Logger logger , final Level level ,
274- final String format , final Object param1 , final Object param2 , final Throwable t ) {
282+ final FilterReply getTurboFilterChainDecision_2 (final Marker marker , final Logger logger , final Level level , final String format , final Object param1 ,
283+ final Object param2 , final Throwable t ) {
275284 if (turboFilterList .size () == 0 ) {
276285 return FilterReply .NEUTRAL ;
277286 }
278- return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format ,
279- new Object [] { param1 , param2 }, t );
287+ return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format , new Object [] { param1 , param2 }, t );
280288 }
281289
282290 // === start listeners ==============================================
@@ -340,10 +348,21 @@ public void start() {
340348 }
341349
342350 public void stop () {
343- reset ();
344- fireOnStop ();
345- resetAllListeners ();
346- super .stop ();
351+ if (!isStarted ())
352+ return ;
353+
354+ try {
355+ configurationLock .lock ();
356+ if (!isStarted ())
357+ return ;
358+
359+ reset ();
360+ fireOnStop ();
361+ resetAllListeners ();
362+ super .stop ();
363+ } finally {
364+ configurationLock .unlock ();
365+ }
347366 }
348367
349368 /**
@@ -395,7 +414,6 @@ public List<String> getFrameworkPackages() {
395414 return frameworkPackages ;
396415 }
397416
398-
399417 @ Override
400418 public void setSequenceNumberGenerator (SequenceNumberGenerator sng ) {
401419 this .sequenceNumberGenerator = sng ;
@@ -411,7 +429,7 @@ public MDCAdapter getMDCAdapter() {
411429 }
412430
413431 public void setMDCAdapter (MDCAdapter anAdapter ) {
414- if (this .mdcAdapter != null ) {
432+ if (this .mdcAdapter != null ) {
415433 StatusManager sm = getStatusManager ();
416434 sm .add (new WarnStatus ("mdcAdapter being reset a second time" , this ));
417435 }
0 commit comments