1
1
/**
2
2
* Logback: the reliable, generic, fast and flexible logging framework.
3
3
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4
- *
4
+ * <p>
5
5
* This program and the accompanying materials are dual-licensed under
6
6
* either the terms of the Eclipse Public License v1.0 as published by
7
7
* the Eclipse Foundation
8
- *
9
- * or (per the licensee's choosing)
10
- *
8
+ * <p>
9
+ * or (per the licensee's choosing)
10
+ * <p>
11
11
* under the terms of the GNU Lesser General Public License version 2.1
12
12
* as published by the Free Software Foundation.
13
13
*/
23
23
import java .util .Map ;
24
24
import java .util .concurrent .ConcurrentHashMap ;
25
25
import java .util .concurrent .ScheduledFuture ;
26
+ import java .util .concurrent .locks .ReentrantLock ;
26
27
27
28
import ch .qos .logback .classic .util .LogbackMDCAdapter ;
28
29
import ch .qos .logback .core .status .ErrorStatus ;
57
58
*/
58
59
public class LoggerContext extends ContextBase implements ILoggerFactory , LifeCycle {
59
60
60
- /** Default setting of packaging data in stack traces */
61
+ /**
62
+ * Default setting of packaging data in stack traces
63
+ */
61
64
public static final boolean DEFAULT_PACKAGING_DATA = false ;
62
65
63
66
final Logger root ;
@@ -74,7 +77,6 @@ public class LoggerContext extends ContextBase implements ILoggerFactory, LifeCy
74
77
75
78
MDCAdapter mdcAdapter ;
76
79
77
-
78
80
private int maxCallerDataDepth = ClassicConstants .DEFAULT_MAX_CALLEDER_DATA_DEPTH ;
79
81
80
82
int resetCount = 0 ;
@@ -91,6 +93,10 @@ public LoggerContext() {
91
93
initEvaluatorMap ();
92
94
size = 1 ;
93
95
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 ();
94
100
}
95
101
96
102
void initEvaluatorMap () {
@@ -117,8 +123,6 @@ public void setName(String name) {
117
123
updateLoggerContextVO ();
118
124
}
119
125
120
-
121
-
122
126
public final Logger getLogger (final Class <?> clazz ) {
123
127
return getLogger (clazz .getName ());
124
128
}
@@ -194,9 +198,7 @@ public Logger exists(String name) {
194
198
195
199
final void noAppenderDefinedWarning (final Logger logger ) {
196
200
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 ));
200
202
}
201
203
}
202
204
@@ -219,17 +221,24 @@ public boolean isPackagingDataEnabled() {
219
221
return packagingDataEnabled ;
220
222
}
221
223
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 ();
225
235
}
226
- scheduledFutures .clear ();
227
236
}
228
237
229
238
private void resetStatusListenersExceptResetResistant () {
230
239
StatusManager sm = getStatusManager ();
231
240
for (StatusListener sl : sm .getCopyOfStatusListenerList ()) {
232
- if (!sl .isResetResistant ()) {
241
+ if (!sl .isResetResistant ()) {
233
242
sm .remove (sl );
234
243
}
235
244
}
@@ -254,29 +263,28 @@ public void resetTurboFilterList() {
254
263
turboFilterList .clear ();
255
264
}
256
265
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 ) {
259
268
if (turboFilterList .size () == 0 ) {
260
269
return FilterReply .NEUTRAL ;
261
270
}
262
271
return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format , params , t );
263
272
}
264
273
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 ) {
267
276
if (turboFilterList .size () == 0 ) {
268
277
return FilterReply .NEUTRAL ;
269
278
}
270
279
return turboFilterList .getTurboFilterChainDecision (marker , logger , level , format , new Object [] { param }, t );
271
280
}
272
281
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 ) {
275
284
if (turboFilterList .size () == 0 ) {
276
285
return FilterReply .NEUTRAL ;
277
286
}
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 );
280
288
}
281
289
282
290
// === start listeners ==============================================
@@ -340,10 +348,21 @@ public void start() {
340
348
}
341
349
342
350
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
+ }
347
366
}
348
367
349
368
/**
@@ -395,7 +414,6 @@ public List<String> getFrameworkPackages() {
395
414
return frameworkPackages ;
396
415
}
397
416
398
-
399
417
@ Override
400
418
public void setSequenceNumberGenerator (SequenceNumberGenerator sng ) {
401
419
this .sequenceNumberGenerator = sng ;
@@ -411,7 +429,7 @@ public MDCAdapter getMDCAdapter() {
411
429
}
412
430
413
431
public void setMDCAdapter (MDCAdapter anAdapter ) {
414
- if (this .mdcAdapter != null ) {
432
+ if (this .mdcAdapter != null ) {
415
433
StatusManager sm = getStatusManager ();
416
434
sm .add (new WarnStatus ("mdcAdapter being reset a second time" , this ));
417
435
}
0 commit comments