1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache license, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the license for the specific language governing permissions and
15  * limitations under the license.
16  */

17 package org.apache.logging.log4j.spi;
18
19 import java.io.IOException;
20 import java.io.ObjectInputStream;
21 import java.io.Serializable;
22 import java.lang.reflect.Field;
23
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.LogBuilder;
26 import org.apache.logging.log4j.LoggingException;
27 import org.apache.logging.log4j.Marker;
28 import org.apache.logging.log4j.MarkerManager;
29 import org.apache.logging.log4j.internal.DefaultLogBuilder;
30 import org.apache.logging.log4j.message.DefaultFlowMessageFactory;
31 import org.apache.logging.log4j.message.EntryMessage;
32 import org.apache.logging.log4j.message.FlowMessageFactory;
33 import org.apache.logging.log4j.message.Message;
34 import org.apache.logging.log4j.message.MessageFactory;
35 import org.apache.logging.log4j.message.MessageFactory2;
36 import org.apache.logging.log4j.message.ParameterizedMessage;
37 import org.apache.logging.log4j.message.ParameterizedMessageFactory;
38 import org.apache.logging.log4j.message.ReusableMessageFactory;
39 import org.apache.logging.log4j.message.SimpleMessage;
40 import org.apache.logging.log4j.message.StringFormattedMessage;
41 import org.apache.logging.log4j.status.StatusLogger;
42 import org.apache.logging.log4j.util.Constants;
43 import org.apache.logging.log4j.util.LambdaUtil;
44 import org.apache.logging.log4j.util.LoaderUtil;
45 import org.apache.logging.log4j.util.MessageSupplier;
46 import org.apache.logging.log4j.util.PerformanceSensitive;
47 import org.apache.logging.log4j.util.PropertiesUtil;
48 import org.apache.logging.log4j.util.StackLocatorUtil;
49 import org.apache.logging.log4j.util.Strings;
50 import org.apache.logging.log4j.util.Supplier;
51
52 /**
53  * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class.
54  */

55 public abstract class AbstractLogger implements ExtendedLogger, LocationAwareLogger, Serializable {
56     // Implementation note: many methods in this class are tuned for performance. MODIFY WITH CARE!
57     // Specifically, try to keep the hot methods to 35 bytecodes or less:
58     // this is within the MaxInlineSize threshold on Java 7 and Java 8 Hotspot and makes these methods
59     // candidates for immediate inlining instead of waiting until they are designated "hot enough".
60
61     /**
62      * Marker for flow tracing.
63      */

64     public static final Marker FLOW_MARKER = MarkerManager.getMarker("FLOW");
65
66     /**
67      * Marker for method entry tracing.
68      */

69     public static final Marker ENTRY_MARKER = MarkerManager.getMarker("ENTER").setParents(FLOW_MARKER);
70
71     /**
72      * Marker for method exit tracing.
73      */

74     public static final Marker EXIT_MARKER = MarkerManager.getMarker("EXIT").setParents(FLOW_MARKER);
75
76     /**
77      * Marker for exception tracing.
78      */

79     public static final Marker EXCEPTION_MARKER = MarkerManager.getMarker("EXCEPTION");
80
81     /**
82      * Marker for throwing exceptions.
83      */

84     public static final Marker THROWING_MARKER = MarkerManager.getMarker("THROWING").setParents(EXCEPTION_MARKER);
85
86     /**
87      * Marker for catching exceptions.
88      */

89     public static final Marker CATCHING_MARKER = MarkerManager.getMarker("CATCHING").setParents(EXCEPTION_MARKER);
90
91     /**
92      * The default MessageFactory class.
93      */

94     public static final Class<? extends MessageFactory> DEFAULT_MESSAGE_FACTORY_CLASS =
95             createClassForProperty("log4j2.messageFactory", ReusableMessageFactory.class,
96                     ParameterizedMessageFactory.class);
97
98     /**
99      * The default FlowMessageFactory class.
100      */

101     public static final Class<? extends FlowMessageFactory> DEFAULT_FLOW_MESSAGE_FACTORY_CLASS =
102             createFlowClassForProperty("log4j2.flowMessageFactory", DefaultFlowMessageFactory.class);
103
104     private static final long serialVersionUID = 2L;
105
106     private static final String FQCN = AbstractLogger.class.getName();
107     private static final String THROWING = "Throwing";
108     private static final String CATCHING = "Catching";
109
110     protected final String name;
111     private final MessageFactory2 messageFactory;
112     private final FlowMessageFactory flowMessageFactory;
113     private static final ThreadLocal<int[]> recursionDepthHolder = new ThreadLocal<>(); // LOG4J2-1518, LOG4J2-2031
114     protected final transient ThreadLocal<DefaultLogBuilder> logBuilder;
115
116     /**
117      * Creates a new logger named after this class (or subclass).
118      */

119     public AbstractLogger() {
120         this.name = getClass().getName();
121         this.messageFactory = createDefaultMessageFactory();
122         this.flowMessageFactory = createDefaultFlowMessageFactory();
123         this.logBuilder = new LocalLogBuilder(this);
124     }
125
126     /**
127      * Creates a new named logger.
128      *
129      * @param name the logger name
130      */

131     public AbstractLogger(final String name) {
132         this(name, createDefaultMessageFactory());
133     }
134
135     /**
136      * Creates a new named logger with a particular {@link MessageFactory}.
137      *
138      * @param name the logger name
139      * @param messageFactory the message factory, if null then use the default message factory.
140      */

141     public AbstractLogger(final String name, final MessageFactory messageFactory) {
142         this.name = name;
143         this.messageFactory = messageFactory == null ? createDefaultMessageFactory() : narrow(messageFactory);
144         this.flowMessageFactory = createDefaultFlowMessageFactory();
145         this.logBuilder = new LocalLogBuilder(this);
146     }
147
148     /**
149      * Checks that the message factory a logger was created with is the same as the given messageFactory. If they are
150      * different log a warning to the {@linkplain StatusLogger}. A null MessageFactory translates to the default
151      * MessageFactory {@link #DEFAULT_MESSAGE_FACTORY_CLASS}.
152      *
153      * @param logger The logger to check
154      * @param messageFactory The message factory to check.
155      */

156     public static void checkMessageFactory(final ExtendedLogger logger, final MessageFactory messageFactory) {
157         final String name = logger.getName();
158         final MessageFactory loggerMessageFactory = logger.getMessageFactory();
159         if (messageFactory != null && !loggerMessageFactory.equals(messageFactory)) {
160             StatusLogger.getLogger().warn(
161                     "The Logger {} was created with the message factory {} and is now requested with the "
162                             + "message factory {}, which may create log events with unexpected formatting.", name,
163                     loggerMessageFactory, messageFactory);
164         } else if (messageFactory == null && !loggerMessageFactory.getClass().equals(DEFAULT_MESSAGE_FACTORY_CLASS)) {
165             StatusLogger
166                     .getLogger()
167                     .warn("The Logger {} was created with the message factory {} and is now requested with a null "
168                             + "message factory (defaults to {}), which may create log events with unexpected "
169                             + "formatting.",
170                             name, loggerMessageFactory, DEFAULT_MESSAGE_FACTORY_CLASS.getName());
171         }
172     }
173
174     @Override
175     public void catching(final Level level, final Throwable throwable) {
176         catching(FQCN, level, throwable);
177     }
178
179     /**
180      * Logs a Throwable that has been caught with location information.
181      *
182      * @param fqcn The fully qualified class name of the <b>caller</b>.
183      * @param level The logging level.
184      * @param throwable The Throwable.
185      */

186     protected void catching(final String fqcn, final Level level, final Throwable throwable) {
187         if (isEnabled(level, CATCHING_MARKER, (Object) nullnull)) {
188             logMessageSafely(fqcn, level, CATCHING_MARKER, catchingMsg(throwable), throwable);
189         }
190     }
191
192     @Override
193     public void catching(final Throwable throwable) {
194         if (isEnabled(Level.ERROR, CATCHING_MARKER, (Object) nullnull)) {
195             logMessageSafely(FQCN, Level.ERROR, CATCHING_MARKER, catchingMsg(throwable), throwable);
196         }
197     }
198
199     protected Message catchingMsg(final Throwable throwable) {
200         return messageFactory.newMessage(CATCHING);
201     }
202
203     private static Class<? extends MessageFactory> createClassForProperty(final String property,
204             final Class<ReusableMessageFactory> reusableParameterizedMessageFactoryClass,
205             final Class<ParameterizedMessageFactory> parameterizedMessageFactoryClass) {
206         try {
207             final String fallback = Constants.ENABLE_THREADLOCALS ? reusableParameterizedMessageFactoryClass.getName()
208                     : parameterizedMessageFactoryClass.getName();
209             final String clsName = PropertiesUtil.getProperties().getStringProperty(property, fallback);
210             return LoaderUtil.loadClass(clsName).asSubclass(MessageFactory.class);
211         } catch (final Throwable throwable) {
212             return parameterizedMessageFactoryClass;
213         }
214     }
215
216     private static Class<? extends FlowMessageFactory> createFlowClassForProperty(final String property,
217             final Class<DefaultFlowMessageFactory> defaultFlowMessageFactoryClass) {
218         try {
219             final String clsName = PropertiesUtil.getProperties().getStringProperty(property, defaultFlowMessageFactoryClass.getName());
220             return LoaderUtil.loadClass(clsName).asSubclass(FlowMessageFactory.class);
221         } catch (final Throwable throwable) {
222             return defaultFlowMessageFactoryClass;
223         }
224     }
225
226     private static MessageFactory2 createDefaultMessageFactory() {
227         try {
228             final MessageFactory result = DEFAULT_MESSAGE_FACTORY_CLASS.newInstance();
229             return narrow(result);
230         } catch (final InstantiationException | IllegalAccessException e) {
231             throw new IllegalStateException(e);
232         }
233     }
234
235     private static MessageFactory2 narrow(final MessageFactory result) {
236         if (result instanceof MessageFactory2) {
237             return (MessageFactory2) result;
238         }
239         return new MessageFactory2Adapter(result);
240     }
241
242     private static FlowMessageFactory createDefaultFlowMessageFactory() {
243         try {
244             return DEFAULT_FLOW_MESSAGE_FACTORY_CLASS.newInstance();
245         } catch (final InstantiationException | IllegalAccessException e) {
246             throw new IllegalStateException(e);
247         }
248     }
249
250     @Override
251     public void debug(final Marker marker, final CharSequence message) {
252         logIfEnabled(FQCN, Level.DEBUG, marker, message, null);
253     }
254
255     @Override
256     public void debug(final Marker marker, final CharSequence message, final Throwable throwable) {
257         logIfEnabled(FQCN, Level.DEBUG, marker, message, throwable);
258     }
259
260     @Override
261     public void debug(final Marker marker, final Message message) {
262         logIfEnabled(FQCN, Level.DEBUG, marker, message, message != null ? message.getThrowable() : null);
263     }
264
265     @Override
266     public void debug(final Marker marker, final Message message, final Throwable throwable) {
267         logIfEnabled(FQCN, Level.DEBUG, marker, message, throwable);
268     }
269
270     @Override
271     public void debug(final Marker marker, final Object message) {
272         logIfEnabled(FQCN, Level.DEBUG, marker, message, null);
273     }
274
275     @Override
276     public void debug(final Marker marker, final Object message, final Throwable throwable) {
277         logIfEnabled(FQCN, Level.DEBUG, marker, message, throwable);
278     }
279
280     @Override
281     public void debug(final Marker marker, final String message) {
282         logIfEnabled(FQCN, Level.DEBUG, marker, message, (Throwable) null);
283     }
284
285     @Override
286     public void debug(final Marker marker, final String message, final Object... params) {
287         logIfEnabled(FQCN, Level.DEBUG, marker, message, params);
288     }
289
290     @Override
291     public void debug(final Marker marker, final String message, final Throwable throwable) {
292         logIfEnabled(FQCN, Level.DEBUG, marker, message, throwable);
293     }
294
295     @Override
296     public void debug(final Message message) {
297         logIfEnabled(FQCN, Level.DEBUG, null, message, message != null ? message.getThrowable() : null);
298     }
299
300     @Override
301     public void debug(final Message message, final Throwable throwable) {
302         logIfEnabled(FQCN, Level.DEBUG, null, message, throwable);
303     }
304
305     @Override
306     public void debug(final CharSequence message) {
307         logIfEnabled(FQCN, Level.DEBUG, null, message, null);
308     }
309
310     @Override
311     public void debug(final CharSequence message, final Throwable throwable) {
312         logIfEnabled(FQCN, Level.DEBUG, null, message, throwable);
313     }
314
315     @Override
316     public void debug(final Object message) {
317         logIfEnabled(FQCN, Level.DEBUG, null, message, null);
318     }
319
320     @Override
321     public void debug(final Object message, final Throwable throwable) {
322         logIfEnabled(FQCN, Level.DEBUG, null, message, throwable);
323     }
324
325     @Override
326     public void debug(final String message) {
327         logIfEnabled(FQCN, Level.DEBUG, null, message, (Throwable) null);
328     }
329
330     @Override
331     public void debug(final String message, final Object... params) {
332         logIfEnabled(FQCN, Level.DEBUG, null, message, params);
333     }
334
335     @Override
336     public void debug(final String message, final Throwable throwable) {
337         logIfEnabled(FQCN, Level.DEBUG, null, message, throwable);
338     }
339
340     @Override
341     public void debug(final Supplier<?> messageSupplier) {
342         logIfEnabled(FQCN, Level.DEBUG, null, messageSupplier, (Throwable) null);
343     }
344
345     @Override
346     public void debug(final Supplier<?> messageSupplier, final Throwable throwable) {
347         logIfEnabled(FQCN, Level.DEBUG, null, messageSupplier, throwable);
348     }
349
350     @Override
351     public void debug(final Marker marker, final Supplier<?> messageSupplier) {
352         logIfEnabled(FQCN, Level.DEBUG, marker, messageSupplier, (Throwable) null);
353     }
354
355     @Override
356     public void debug(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
357         logIfEnabled(FQCN, Level.DEBUG, marker, message, paramSuppliers);
358     }
359
360     @Override
361     public void debug(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
362         logIfEnabled(FQCN, Level.DEBUG, marker, messageSupplier, throwable);
363     }
364
365     @Override
366     public void debug(final String message, final Supplier<?>... paramSuppliers) {
367         logIfEnabled(FQCN, Level.DEBUG, null, message, paramSuppliers);
368     }
369
370     @Override
371     public void debug(final Marker marker, final MessageSupplier messageSupplier) {
372         logIfEnabled(FQCN, Level.DEBUG, marker, messageSupplier, (Throwable) null);
373     }
374
375     @Override
376     public void debug(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
377         logIfEnabled(FQCN, Level.DEBUG, marker, messageSupplier, throwable);
378     }
379
380     @Override
381     public void debug(final MessageSupplier messageSupplier) {
382         logIfEnabled(FQCN, Level.DEBUG, null, messageSupplier, (Throwable) null);
383     }
384
385     @Override
386     public void debug(final MessageSupplier messageSupplier, final Throwable throwable) {
387         logIfEnabled(FQCN, Level.DEBUG, null, messageSupplier, throwable);
388     }
389
390     @Override
391     public void debug(final Marker marker, final String message, final Object p0) {
392         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0);
393     }
394
395     @Override
396     public void debug(final Marker marker, final String message, final Object p0, final Object p1) {
397         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1);
398     }
399
400     @Override
401     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
402         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2);
403     }
404
405     @Override
406     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
407             final Object p3) {
408         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3);
409     }
410
411     @Override
412     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
413             final Object p3, final Object p4) {
414         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4);
415     }
416
417     @Override
418     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
419             final Object p3, final Object p4, final Object p5) {
420         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5);
421     }
422
423     @Override
424     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
425             final Object p3, final Object p4, final Object p5,
426             final Object p6) {
427         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6);
428     }
429
430     @Override
431     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
432             final Object p3, final Object p4, final Object p5,
433             final Object p6, final Object p7) {
434         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
435     }
436
437     @Override
438     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
439             final Object p3, final Object p4, final Object p5,
440             final Object p6, final Object p7, final Object p8) {
441         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
442     }
443
444     @Override
445     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
446             final Object p3, final Object p4, final Object p5,
447             final Object p6, final Object p7, final Object p8, final Object p9) {
448         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
449     }
450
451     @Override
452     public void debug(final String message, final Object p0) {
453         logIfEnabled(FQCN, Level.DEBUG, null, message, p0);
454     }
455
456     @Override
457     public void debug(final String message, final Object p0, final Object p1) {
458         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1);
459     }
460
461     @Override
462     public void debug(final String message, final Object p0, final Object p1, final Object p2) {
463         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2);
464     }
465
466     @Override
467     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
468         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3);
469     }
470
471     @Override
472     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
473             final Object p4) {
474         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4);
475     }
476
477     @Override
478     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
479             final Object p4, final Object p5) {
480         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5);
481     }
482
483     @Override
484     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
485             final Object p4, final Object p5, final Object p6) {
486         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6);
487     }
488
489     @Override
490     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
491             final Object p4, final Object p5, final Object p6,
492             final Object p7) {
493         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
494     }
495
496     @Override
497     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
498             final Object p4, final Object p5, final Object p6,
499             final Object p7, final Object p8) {
500         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
501     }
502
503     @Override
504     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
505             final Object p4, final Object p5, final Object p6,
506             final Object p7, final Object p8, final Object p9) {
507         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
508     }
509
510     /**
511      * Logs entry to a method with location information.
512      *
513      * @param fqcn The fully qualified class name of the <b>caller</b>.
514      * @param format Format String for the parameters.
515      * @param paramSuppliers The Suppliers of the parameters.
516      */

517     protected EntryMessage enter(final String fqcn, final String format, final Supplier<?>... paramSuppliers) {
518         EntryMessage entryMsg = null;
519         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
520             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, paramSuppliers), null);
521         }
522         return entryMsg;
523     }
524
525     /**
526      * Logs entry to a method with location information.
527      *
528      * @param fqcn The fully qualified class name of the <b>caller</b>.
529      * @param format The format String for the parameters.
530      * @param paramSuppliers The parameters to the method.
531      */

532     @Deprecated
533     protected EntryMessage enter(final String fqcn, final String format, final MessageSupplier... paramSuppliers) {
534         EntryMessage entryMsg = null;
535         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
536             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, paramSuppliers), null);
537         }
538         return entryMsg;
539     }
540
541     /**
542      * Logs entry to a method with location information.
543      *
544      * @param fqcn The fully qualified class name of the <b>caller</b>.
545      * @param format The format String for the parameters.
546      * @param params The parameters to the method.
547      */

548     protected EntryMessage enter(final String fqcn, final String format, final Object... params) {
549         EntryMessage entryMsg = null;
550         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
551             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, params), null);
552         }
553         return entryMsg;
554     }
555
556     /**
557      * Logs entry to a method with location information.
558      *
559      * @param fqcn The fully qualified class name of the <b>caller</b>.
560      * @param messageSupplier The Supplier of the Message.
561      */

562     @Deprecated
563     protected EntryMessage enter(final String fqcn, final MessageSupplier messageSupplier) {
564         EntryMessage message = null;
565         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
566             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, message = flowMessageFactory.newEntryMessage(
567                     messageSupplier.get()), null);
568         }
569         return message;
570     }
571
572     /**
573      * Logs entry to a method with location information.
574      *
575      * @param fqcn
576      *            The fully qualified class name of the <b>caller</b>.
577      * @param message
578      *            the Message.
579      * @since 2.6
580      */

581     protected EntryMessage enter(final String fqcn, final Message message) {
582         EntryMessage flowMessage = null;
583         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
584             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, flowMessage = flowMessageFactory.newEntryMessage(message),
585                     null);
586         }
587         return flowMessage;
588     }
589
590     @Deprecated
591     @Override
592     public void entry() {
593         entry(FQCN, (Object[]) null);
594     }
595
596     @Override
597     public void entry(final Object... params) {
598         entry(FQCN, params);
599     }
600
601     /**
602      * Logs entry to a method with location information.
603      *
604      * @param fqcn The fully qualified class name of the <b>caller</b>.
605      * @param params The parameters to the method.
606      */

607     protected void entry(final String fqcn, final Object... params) {
608         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) nullnull)) {
609             if (params == null) {
610                 logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg(null, (Supplier<?>[]) null), null);
611             } else {
612                 logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg(null, params), null);
613             }
614         }
615     }
616
617     protected EntryMessage entryMsg(final String format, final Object... params) {
618         final int count = params == null ? 0 : params.length;
619         if (count == 0) {
620             if (Strings.isEmpty(format)) {
621                 return flowMessageFactory.newEntryMessage(null);
622             }
623             return flowMessageFactory.newEntryMessage(new SimpleMessage(format));
624         }
625         if (format != null) {
626             return flowMessageFactory.newEntryMessage(new ParameterizedMessage(format, params));
627         }
628         final StringBuilder sb = new StringBuilder();
629         sb.append("params(");
630         for (int i = 0; i < count; i++) {
631             if (i > 0) {
632                 sb.append(", ");
633             }
634             final Object parm = params[i];
635             sb.append(parm instanceof Message ? ((Message) parm).getFormattedMessage() : String.valueOf(parm));
636         }
637         sb.append(')');
638         return flowMessageFactory.newEntryMessage(new SimpleMessage(sb));
639     }
640
641     protected EntryMessage entryMsg(final String format, final MessageSupplier... paramSuppliers) {
642         final int count = paramSuppliers == null ? 0 : paramSuppliers.length;
643         final Object[] params = new Object[count];
644         for (int i = 0; i < count; i++) {
645             params[i] = paramSuppliers[i].get();
646             params[i] = params[i] != null ? ((Message) params[i]).getFormattedMessage() : null;
647         }
648         return entryMsg(format, params);
649     }
650
651     protected EntryMessage entryMsg(final String format, final Supplier<?>... paramSuppliers) {
652         final int count = paramSuppliers == null ? 0 : paramSuppliers.length;
653         final Object[] params = new Object[count];
654         for (int i = 0; i < count; i++) {
655             params[i] = paramSuppliers[i].get();
656             if (params[i] instanceof Message) {
657                 params[i] = ((Message) params[i]).getFormattedMessage();
658             }
659         }
660         return entryMsg(format, params);
661     }
662
663     @Override
664     public void error(final Marker marker, final Message message) {
665         logIfEnabled(FQCN, Level.ERROR, marker, message, message != null ? message.getThrowable() : null);
666     }
667
668     @Override
669     public void error(final Marker marker, final Message message, final Throwable throwable) {
670         logIfEnabled(FQCN, Level.ERROR, marker, message, throwable);
671     }
672
673     @Override
674     public void error(final Marker marker, final CharSequence message) {
675         logIfEnabled(FQCN, Level.ERROR, marker, message, null);
676     }
677
678     @Override
679     public void error(final Marker marker, final CharSequence message, final Throwable throwable) {
680         logIfEnabled(FQCN, Level.ERROR, marker, message, throwable);
681     }
682
683     @Override
684     public void error(final Marker marker, final Object message) {
685         logIfEnabled(FQCN, Level.ERROR, marker, message, null);
686     }
687
688     @Override
689     public void error(final Marker marker, final Object message, final Throwable throwable) {
690         logIfEnabled(FQCN, Level.ERROR, marker, message, throwable);
691     }
692
693     @Override
694     public void error(final Marker marker, final String message) {
695         logIfEnabled(FQCN, Level.ERROR, marker, message, (Throwable) null);
696     }
697
698     @Override
699     public void error(final Marker marker, final String message, final Object... params) {
700         logIfEnabled(FQCN, Level.ERROR, marker, message, params);
701     }
702
703     @Override
704     public void error(final Marker marker, final String message, final Throwable throwable) {
705         logIfEnabled(FQCN, Level.ERROR, marker, message, throwable);
706     }
707
708     @Override
709     public void error(final Message message) {
710         logIfEnabled(FQCN, Level.ERROR, null, message, message != null ? message.getThrowable() : null);
711     }
712
713     @Override
714     public void error(final Message message, final Throwable throwable) {
715         logIfEnabled(FQCN, Level.ERROR, null, message, throwable);
716     }
717
718     @Override
719     public void error(final CharSequence message) {
720         logIfEnabled(FQCN, Level.ERROR, null, message, null);
721     }
722
723     @Override
724     public void error(final CharSequence message, final Throwable throwable) {
725         logIfEnabled(FQCN, Level.ERROR, null, message, throwable);
726     }
727
728     @Override
729     public void error(final Object message) {
730         logIfEnabled(FQCN, Level.ERROR, null, message, null);
731     }
732
733     @Override
734     public void error(final Object message, final Throwable throwable) {
735         logIfEnabled(FQCN, Level.ERROR, null, message, throwable);
736     }
737
738     @Override
739     public void error(final String message) {
740         logIfEnabled(FQCN, Level.ERROR, null, message, (Throwable) null);
741     }
742
743     @Override
744     public void error(final String message, final Object... params) {
745         logIfEnabled(FQCN, Level.ERROR, null, message, params);
746     }
747
748     @Override
749     public void error(final String message, final Throwable throwable) {
750         logIfEnabled(FQCN, Level.ERROR, null, message, throwable);
751     }
752
753     @Override
754     public void error(final Supplier<?> messageSupplier) {
755         logIfEnabled(FQCN, Level.ERROR, null, messageSupplier, (Throwable) null);
756     }
757
758     @Override
759     public void error(final Supplier<?> messageSupplier, final Throwable throwable) {
760         logIfEnabled(FQCN, Level.ERROR, null, messageSupplier, throwable);
761     }
762
763     @Override
764     public void error(final Marker marker, final Supplier<?> messageSupplier) {
765         logIfEnabled(FQCN, Level.ERROR, marker, messageSupplier, (Throwable) null);
766     }
767
768     @Override
769     public void error(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
770         logIfEnabled(FQCN, Level.ERROR, marker, message, paramSuppliers);
771     }
772
773     @Override
774     public void error(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
775         logIfEnabled(FQCN, Level.ERROR, marker, messageSupplier, throwable);
776     }
777
778     @Override
779     public void error(final String message, final Supplier<?>... paramSuppliers) {
780         logIfEnabled(FQCN, Level.ERROR, null, message, paramSuppliers);
781     }
782
783     @Override
784     public void error(final Marker marker, final MessageSupplier messageSupplier) {
785         logIfEnabled(FQCN, Level.ERROR, marker, messageSupplier, (Throwable) null);
786     }
787
788     @Override
789     public void error(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
790         logIfEnabled(FQCN, Level.ERROR, marker, messageSupplier, throwable);
791     }
792
793     @Override
794     public void error(final MessageSupplier messageSupplier) {
795         logIfEnabled(FQCN, Level.ERROR, null, messageSupplier, (Throwable) null);
796     }
797
798     @Override
799     public void error(final MessageSupplier messageSupplier, final Throwable throwable) {
800         logIfEnabled(FQCN, Level.ERROR, null, messageSupplier, throwable);
801     }
802
803     @Override
804     public void error(final Marker marker, final String message, final Object p0) {
805         logIfEnabled(FQCN, Level.ERROR, marker, message, p0);
806     }
807
808     @Override
809     public void error(final Marker marker, final String message, final Object p0, final Object p1) {
810         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1);
811     }
812
813     @Override
814     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
815         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2);
816     }
817
818     @Override
819     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
820             final Object p3) {
821         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3);
822     }
823
824     @Override
825     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
826             final Object p3, final Object p4) {
827         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4);
828     }
829
830     @Override
831     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
832             final Object p3, final Object p4, final Object p5) {
833         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5);
834     }
835
836     @Override
837     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
838             final Object p3, final Object p4, final Object p5,
839             final Object p6) {
840         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6);
841     }
842
843     @Override
844     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
845             final Object p3, final Object p4, final Object p5,
846             final Object p6, final Object p7) {
847         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
848     }
849
850     @Override
851     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
852             final Object p3, final Object p4, final Object p5,
853             final Object p6, final Object p7, final Object p8) {
854         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
855     }
856
857     @Override
858     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
859             final Object p3, final Object p4, final Object p5,
860             final Object p6, final Object p7, final Object p8, final Object p9) {
861         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
862     }
863
864     @Override
865     public void error(final String message, final Object p0) {
866         logIfEnabled(FQCN, Level.ERROR, null, message, p0);
867     }
868
869     @Override
870     public void error(final String message, final Object p0, final Object p1) {
871         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1);
872     }
873
874     @Override
875     public void error(final String message, final Object p0, final Object p1, final Object p2) {
876         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2);
877     }
878
879     @Override
880     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
881         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3);
882     }
883
884     @Override
885     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
886             final Object p4) {
887         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4);
888     }
889
890     @Override
891     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
892             final Object p4, final Object p5) {
893         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5);
894     }
895
896     @Override
897     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
898             final Object p4, final Object p5, final Object p6) {
899         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6);
900     }
901
902     @Override
903     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
904             final Object p4, final Object p5, final Object p6, final Object p7) {
905         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
906     }
907
908     @Override
909     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
910             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
911         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
912     }
913
914     @Override
915     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
916             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
917         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
918     }
919
920     @Deprecated
921     @Override
922     public void exit() {
923         exit(FQCN, (Object) null);
924     }
925
926     @Deprecated
927     @Override
928     public <R> R exit(final R result) {
929         return exit(FQCN, result);
930     }
931
932     /**
933      * Logs exiting from a method with the result and location information.
934      *
935      * @param fqcn The fully qualified class name of the <b>caller</b>.
936      * @param <R> The type of the parameter and object being returned.
937      * @param result The result being returned from the method call.
938      * @return the return value passed to this method.
939      */

940     protected <R> R exit(final String fqcn, final R result) {
941         if (isEnabled(Level.TRACE, EXIT_MARKER, (CharSequence) nullnull)) {
942             logMessageSafely(fqcn, Level.TRACE, EXIT_MARKER, exitMsg(null, result), null);
943         }
944         return result;
945     }
946
947     /**
948      * Logs exiting from a method with the result and location information.
949      *
950      * @param fqcn The fully qualified class name of the <b>caller</b>.
951      * @param <R> The type of the parameter and object being returned.
952      * @param result The result being returned from the method call.
953      * @return the return value passed to this method.
954      */

955     protected <R> R exit(final String fqcn, final String format, final R result) {
956         if (isEnabled(Level.TRACE, EXIT_MARKER, (CharSequence) nullnull)) {
957             logMessageSafely(fqcn, Level.TRACE, EXIT_MARKER, exitMsg(format, result), null);
958         }
959         return result;
960     }
961
962     protected Message exitMsg(final String format, final Object result) {
963         if (result == null) {
964             if (format == null) {
965                 return messageFactory.newMessage("Exit");
966             }
967             return messageFactory.newMessage("Exit: " + format);
968         }
969         if (format == null) {
970             return messageFactory.newMessage("Exit with(" + result + ')');
971         }
972         return messageFactory.newMessage("Exit: " + format, result);
973
974     }
975
976     @Override
977     public void fatal(final Marker marker, final Message message) {
978         logIfEnabled(FQCN, Level.FATAL, marker, message, message != null ? message.getThrowable() : null);
979     }
980
981     @Override
982     public void fatal(final Marker marker, final Message message, final Throwable throwable) {
983         logIfEnabled(FQCN, Level.FATAL, marker, message, throwable);
984     }
985
986     @Override
987     public void fatal(final Marker marker, final CharSequence message) {
988         logIfEnabled(FQCN, Level.FATAL, marker, message, null);
989     }
990
991     @Override
992     public void fatal(final Marker marker, final CharSequence message, final Throwable throwable) {
993         logIfEnabled(FQCN, Level.FATAL, marker, message, throwable);
994     }
995
996     @Override
997     public void fatal(final Marker marker, final Object message) {
998         logIfEnabled(FQCN, Level.FATAL, marker, message, null);
999     }
1000
1001     @Override
1002     public void fatal(final Marker marker, final Object message, final Throwable throwable) {
1003         logIfEnabled(FQCN, Level.FATAL, marker, message, throwable);
1004     }
1005
1006     @Override
1007     public void fatal(final Marker marker, final String message) {
1008         logIfEnabled(FQCN, Level.FATAL, marker, message, (Throwable) null);
1009     }
1010
1011     @Override
1012     public void fatal(final Marker marker, final String message, final Object... params) {
1013         logIfEnabled(FQCN, Level.FATAL, marker, message, params);
1014     }
1015
1016     @Override
1017     public void fatal(final Marker marker, final String message, final Throwable throwable) {
1018         logIfEnabled(FQCN, Level.FATAL, marker, message, throwable);
1019     }
1020
1021     @Override
1022     public void fatal(final Message message) {
1023         logIfEnabled(FQCN, Level.FATAL, null, message, message != null ? message.getThrowable() : null);
1024     }
1025
1026     @Override
1027     public void fatal(final Message message, final Throwable throwable) {
1028         logIfEnabled(FQCN, Level.FATAL, null, message, throwable);
1029     }
1030
1031     @Override
1032     public void fatal(final CharSequence message) {
1033         logIfEnabled(FQCN, Level.FATAL, null, message, null);
1034     }
1035
1036     @Override
1037     public void fatal(final CharSequence message, final Throwable throwable) {
1038         logIfEnabled(FQCN, Level.FATAL, null, message, throwable);
1039     }
1040
1041     @Override
1042     public void fatal(final Object message) {
1043         logIfEnabled(FQCN, Level.FATAL, null, message, null);
1044     }
1045
1046     @Override
1047     public void fatal(final Object message, final Throwable throwable) {
1048         logIfEnabled(FQCN, Level.FATAL, null, message, throwable);
1049     }
1050
1051     @Override
1052     public void fatal(final String message) {
1053         logIfEnabled(FQCN, Level.FATAL, null, message, (Throwable) null);
1054     }
1055
1056     @Override
1057     public void fatal(final String message, final Object... params) {
1058         logIfEnabled(FQCN, Level.FATAL, null, message, params);
1059     }
1060
1061     @Override
1062     public void fatal(final String message, final Throwable throwable) {
1063         logIfEnabled(FQCN, Level.FATAL, null, message, throwable);
1064     }
1065
1066     @Override
1067     public void fatal(final Supplier<?> messageSupplier) {
1068         logIfEnabled(FQCN, Level.FATAL, null, messageSupplier, (Throwable) null);
1069     }
1070
1071     @Override
1072     public void fatal(final Supplier<?> messageSupplier, final Throwable throwable) {
1073         logIfEnabled(FQCN, Level.FATAL, null, messageSupplier, throwable);
1074     }
1075
1076     @Override
1077     public void fatal(final Marker marker, final Supplier<?> messageSupplier) {
1078         logIfEnabled(FQCN, Level.FATAL, marker, messageSupplier, (Throwable) null);
1079     }
1080
1081     @Override
1082     public void fatal(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1083         logIfEnabled(FQCN, Level.FATAL, marker, message, paramSuppliers);
1084     }
1085
1086     @Override
1087     public void fatal(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
1088         logIfEnabled(FQCN, Level.FATAL, marker, messageSupplier, throwable);
1089     }
1090
1091     @Override
1092     public void fatal(final String message, final Supplier<?>... paramSuppliers) {
1093         logIfEnabled(FQCN, Level.FATAL, null, message, paramSuppliers);
1094     }
1095
1096     @Override
1097     public void fatal(final Marker marker, final MessageSupplier messageSupplier) {
1098         logIfEnabled(FQCN, Level.FATAL, marker, messageSupplier, (Throwable) null);
1099     }
1100
1101     @Override
1102     public void fatal(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
1103         logIfEnabled(FQCN, Level.FATAL, marker, messageSupplier, throwable);
1104     }
1105
1106     @Override
1107     public void fatal(final MessageSupplier messageSupplier) {
1108         logIfEnabled(FQCN, Level.FATAL, null, messageSupplier, (Throwable) null);
1109     }
1110
1111     @Override
1112     public void fatal(final MessageSupplier messageSupplier, final Throwable throwable) {
1113         logIfEnabled(FQCN, Level.FATAL, null, messageSupplier, throwable);
1114     }
1115
1116     @Override
1117     public void fatal(final Marker marker, final String message, final Object p0) {
1118         logIfEnabled(FQCN, Level.FATAL, marker, message, p0);
1119     }
1120
1121     @Override
1122     public void fatal(final Marker marker, final String message, final Object p0, final Object p1) {
1123         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1);
1124     }
1125
1126     @Override
1127     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
1128         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2);
1129     }
1130
1131     @Override
1132     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1133             final Object p3) {
1134         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3);
1135     }
1136
1137     @Override
1138     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1139             final Object p3, final Object p4) {
1140         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4);
1141     }
1142
1143     @Override
1144     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1145             final Object p3, final Object p4, final Object p5) {
1146         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5);
1147     }
1148
1149     @Override
1150     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1151             final Object p3, final Object p4, final Object p5, final Object p6) {
1152         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6);
1153     }
1154
1155     @Override
1156     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1157             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
1158         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1159     }
1160
1161     @Override
1162     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1163             final Object p3, final Object p4, final Object p5,
1164             final Object p6, final Object p7, final Object p8) {
1165         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1166     }
1167
1168     @Override
1169     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1170             final Object p3, final Object p4, final Object p5,
1171             final Object p6, final Object p7, final Object p8, final Object p9) {
1172         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1173     }
1174
1175     @Override
1176     public void fatal(final String message, final Object p0) {
1177         logIfEnabled(FQCN, Level.FATAL, null, message, p0);
1178     }
1179
1180     @Override
1181     public void fatal(final String message, final Object p0, final Object p1) {
1182         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1);
1183     }
1184
1185     @Override
1186     public void fatal(final String message, final Object p0, final Object p1, final Object p2) {
1187         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2);
1188     }
1189
1190     @Override
1191     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1192         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3);
1193     }
1194
1195     @Override
1196     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1197             final Object p4) {
1198         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4);
1199     }
1200
1201     @Override
1202     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1203             final Object p4, final Object p5) {
1204         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5);
1205     }
1206
1207     @Override
1208     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1209             final Object p4, final Object p5, final Object p6) {
1210         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6);
1211     }
1212
1213     @Override
1214     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1215             final Object p4, final Object p5, final Object p6, final Object p7) {
1216         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1217     }
1218
1219     @Override
1220     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1221             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
1222         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1223     }
1224
1225     @Override
1226     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1227             final Object p4, final Object p5, final Object p6,
1228             final Object p7, final Object p8, final Object p9) {
1229         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1230     }
1231
1232     @SuppressWarnings("unchecked")
1233     @Override
1234     public <MF extends MessageFactory> MF getMessageFactory() {
1235         return (MF) messageFactory;
1236     }
1237
1238     @Override
1239     public String getName() {
1240         return name;
1241     }
1242
1243     @Override
1244     public void info(final Marker marker, final Message message) {
1245         logIfEnabled(FQCN, Level.INFO, marker, message, message != null ? message.getThrowable() : null);
1246     }
1247
1248     @Override
1249     public void info(final Marker marker, final Message message, final Throwable throwable) {
1250         logIfEnabled(FQCN, Level.INFO, marker, message, throwable);
1251     }
1252
1253     @Override
1254     public void info(final Marker marker, final CharSequence message) {
1255         logIfEnabled(FQCN, Level.INFO, marker, message, null);
1256     }
1257
1258     @Override
1259     public void info(final Marker marker, final CharSequence message, final Throwable throwable) {
1260         logIfEnabled(FQCN, Level.INFO, marker, message, throwable);
1261     }
1262
1263     @Override
1264     public void info(final Marker marker, final Object message) {
1265         logIfEnabled(FQCN, Level.INFO, marker, message, null);
1266     }
1267
1268     @Override
1269     public void info(final Marker marker, final Object message, final Throwable throwable) {
1270         logIfEnabled(FQCN, Level.INFO, marker, message, throwable);
1271     }
1272
1273     @Override
1274     public void info(final Marker marker, final String message) {
1275         logIfEnabled(FQCN, Level.INFO, marker, message, (Throwable) null);
1276     }
1277
1278     @Override
1279     public void info(final Marker marker, final String message, final Object... params) {
1280         logIfEnabled(FQCN, Level.INFO, marker, message, params);
1281     }
1282
1283     @Override
1284     public void info(final Marker marker, final String message, final Throwable throwable) {
1285         logIfEnabled(FQCN, Level.INFO, marker, message, throwable);
1286     }
1287
1288     @Override
1289     public void info(final Message message) {
1290         logIfEnabled(FQCN, Level.INFO, null, message, message != null ? message.getThrowable() : null);
1291     }
1292
1293     @Override
1294     public void info(final Message message, final Throwable throwable) {
1295         logIfEnabled(FQCN, Level.INFO, null, message, throwable);
1296     }
1297
1298     @Override
1299     public void info(final CharSequence message) {
1300         logIfEnabled(FQCN, Level.INFO, null, message, null);
1301     }
1302
1303     @Override
1304     public void info(final CharSequence message, final Throwable throwable) {
1305         logIfEnabled(FQCN, Level.INFO, null, message, throwable);
1306     }
1307
1308     @Override
1309     public void info(final Object message) {
1310         logIfEnabled(FQCN, Level.INFO, null, message, null);
1311     }
1312
1313     @Override
1314     public void info(final Object message, final Throwable throwable) {
1315         logIfEnabled(FQCN, Level.INFO, null, message, throwable);
1316     }
1317
1318     @Override
1319     public void info(final String message) {
1320         logIfEnabled(FQCN, Level.INFO, null, message, (Throwable) null);
1321     }
1322
1323     @Override
1324     public void info(final String message, final Object... params) {
1325         logIfEnabled(FQCN, Level.INFO, null, message, params);
1326     }
1327
1328     @Override
1329     public void info(final String message, final Throwable throwable) {
1330         logIfEnabled(FQCN, Level.INFO, null, message, throwable);
1331     }
1332
1333     @Override
1334     public void info(final Supplier<?> messageSupplier) {
1335         logIfEnabled(FQCN, Level.INFO, null, messageSupplier, (Throwable) null);
1336     }
1337
1338     @Override
1339     public void info(final Supplier<?> messageSupplier, final Throwable throwable) {
1340         logIfEnabled(FQCN, Level.INFO, null, messageSupplier, throwable);
1341     }
1342
1343     @Override
1344     public void info(final Marker marker, final Supplier<?> messageSupplier) {
1345         logIfEnabled(FQCN, Level.INFO, marker, messageSupplier, (Throwable) null);
1346     }
1347
1348     @Override
1349     public void info(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1350         logIfEnabled(FQCN, Level.INFO, marker, message, paramSuppliers);
1351     }
1352
1353     @Override
1354     public void info(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
1355         logIfEnabled(FQCN, Level.INFO, marker, messageSupplier, throwable);
1356     }
1357
1358     @Override
1359     public void info(final String message, final Supplier<?>... paramSuppliers) {
1360         logIfEnabled(FQCN, Level.INFO, null, message, paramSuppliers);
1361     }
1362
1363     @Override
1364     public void info(final Marker marker, final MessageSupplier messageSupplier) {
1365         logIfEnabled(FQCN, Level.INFO, marker, messageSupplier, (Throwable) null);
1366     }
1367
1368     @Override
1369     public void info(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
1370         logIfEnabled(FQCN, Level.INFO, marker, messageSupplier, throwable);
1371     }
1372
1373     @Override
1374     public void info(final MessageSupplier messageSupplier) {
1375         logIfEnabled(FQCN, Level.INFO, null, messageSupplier, (Throwable) null);
1376     }
1377
1378     @Override
1379     public void info(final MessageSupplier messageSupplier, final Throwable throwable) {
1380         logIfEnabled(FQCN, Level.INFO, null, messageSupplier, throwable);
1381     }
1382
1383     @Override
1384     public void info(final Marker marker, final String message, final Object p0) {
1385         logIfEnabled(FQCN, Level.INFO, marker, message, p0);
1386     }
1387
1388     @Override
1389     public void info(final Marker marker, final String message, final Object p0, final Object p1) {
1390         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1);
1391     }
1392
1393     @Override
1394     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
1395         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2);
1396     }
1397
1398     @Override
1399     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1400             final Object p3) {
1401         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3);
1402     }
1403
1404     @Override
1405     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1406             final Object p3, final Object p4) {
1407         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4);
1408     }
1409
1410     @Override
1411     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1412             final Object p3, final Object p4, final Object p5) {
1413         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5);
1414     }
1415
1416     @Override
1417     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1418             final Object p3, final Object p4, final Object p5, final Object p6) {
1419         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6);
1420     }
1421
1422     @Override
1423     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1424             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
1425         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1426     }
1427
1428     @Override
1429     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1430             final Object p3, final Object p4, final Object p5,
1431             final Object p6, final Object p7, final Object p8) {
1432         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1433     }
1434
1435     @Override
1436     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1437             final Object p3, final Object p4, final Object p5,
1438             final Object p6, final Object p7, final Object p8, final Object p9) {
1439         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1440     }
1441
1442     @Override
1443     public void info(final String message, final Object p0) {
1444         logIfEnabled(FQCN, Level.INFO, null, message, p0);
1445     }
1446
1447     @Override
1448     public void info(final String message, final Object p0, final Object p1) {
1449         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1);
1450     }
1451
1452     @Override
1453     public void info(final String message, final Object p0, final Object p1, final Object p2) {
1454         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2);
1455     }
1456
1457     @Override
1458     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1459         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3);
1460     }
1461
1462     @Override
1463     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1464             final Object p4) {
1465         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4);
1466     }
1467
1468     @Override
1469     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1470             final Object p4, final Object p5) {
1471         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5);
1472     }
1473
1474     @Override
1475     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1476             final Object p4, final Object p5, final Object p6) {
1477         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6);
1478     }
1479
1480     @Override
1481     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1482             final Object p4, final Object p5, final Object p6,
1483             final Object p7) {
1484         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1485     }
1486
1487     @Override
1488     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1489             final Object p4, final Object p5, final Object p6,
1490             final Object p7, final Object p8) {
1491         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1492     }
1493
1494     @Override
1495     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1496             final Object p4, final Object p5, final Object p6,
1497             final Object p7, final Object p8, final Object p9) {
1498         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1499     }
1500
1501     @Override
1502     public boolean isDebugEnabled() {
1503         return isEnabled(Level.DEBUG, nullnull);
1504     }
1505
1506     @Override
1507     public boolean isDebugEnabled(final Marker marker) {
1508         return isEnabled(Level.DEBUG, marker, (Object) nullnull);
1509     }
1510
1511     @Override
1512     public boolean isEnabled(final Level level) {
1513         return isEnabled(level, null, (Object) nullnull);
1514     }
1515
1516     @Override
1517     public boolean isEnabled(final Level level, final Marker marker) {
1518         return isEnabled(level, marker, (Object) nullnull);
1519     }
1520
1521     @Override
1522     public boolean isErrorEnabled() {
1523         return isEnabled(Level.ERROR, null, (Object) nullnull);
1524     }
1525
1526     @Override
1527     public boolean isErrorEnabled(final Marker marker) {
1528         return isEnabled(Level.ERROR, marker, (Object) nullnull);
1529     }
1530
1531     @Override
1532     public boolean isFatalEnabled() {
1533         return isEnabled(Level.FATAL, null, (Object) nullnull);
1534     }
1535
1536     @Override
1537     public boolean isFatalEnabled(final Marker marker) {
1538         return isEnabled(Level.FATAL, marker, (Object) nullnull);
1539     }
1540
1541     @Override
1542     public boolean isInfoEnabled() {
1543         return isEnabled(Level.INFO, null, (Object) nullnull);
1544     }
1545
1546     @Override
1547     public boolean isInfoEnabled(final Marker marker) {
1548         return isEnabled(Level.INFO, marker, (Object) nullnull);
1549     }
1550
1551     @Override
1552     public boolean isTraceEnabled() {
1553         return isEnabled(Level.TRACE, null, (Object) nullnull);
1554     }
1555
1556     @Override
1557     public boolean isTraceEnabled(final Marker marker) {
1558         return isEnabled(Level.TRACE, marker, (Object) nullnull);
1559     }
1560
1561     @Override
1562     public boolean isWarnEnabled() {
1563         return isEnabled(Level.WARN, null, (Object) nullnull);
1564     }
1565
1566     @Override
1567     public boolean isWarnEnabled(final Marker marker) {
1568         return isEnabled(Level.WARN, marker, (Object) nullnull);
1569     }
1570
1571     @Override
1572     public void log(final Level level, final Marker marker, final Message message) {
1573         logIfEnabled(FQCN, level, marker, message, message != null ? message.getThrowable() : null);
1574     }
1575
1576     @Override
1577     public void log(final Level level, final Marker marker, final Message message, final Throwable throwable) {
1578         logIfEnabled(FQCN, level, marker, message, throwable);
1579     }
1580
1581     @Override
1582     public void log(final Level level, final Marker marker, final CharSequence message) {
1583         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1584     }
1585
1586     @Override
1587     public void log(final Level level, final Marker marker, final CharSequence message, final Throwable throwable) {
1588         if (isEnabled(level, marker, message, throwable)) {
1589             logMessage(FQCN, level, marker, message, throwable);
1590         }
1591     }
1592
1593     @Override
1594     public void log(final Level level, final Marker marker, final Object message) {
1595         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1596     }
1597
1598     @Override
1599     public void log(final Level level, final Marker marker, final Object message, final Throwable throwable) {
1600         if (isEnabled(level, marker, message, throwable)) {
1601             logMessage(FQCN, level, marker, message, throwable);
1602         }
1603     }
1604
1605     @Override
1606     public void log(final Level level, final Marker marker, final String message) {
1607         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1608     }
1609
1610     @Override
1611     public void log(final Level level, final Marker marker, final String message, final Object... params) {
1612         logIfEnabled(FQCN, level, marker, message, params);
1613     }
1614
1615     @Override
1616     public void log(final Level level, final Marker marker, final String message, final Throwable throwable) {
1617         logIfEnabled(FQCN, level, marker, message, throwable);
1618     }
1619
1620     @Override
1621     public void log(final Level level, final Message message) {
1622         logIfEnabled(FQCN, level, null, message, message != null ? message.getThrowable() : null);
1623     }
1624
1625     @Override
1626     public void log(final Level level, final Message message, final Throwable throwable) {
1627         logIfEnabled(FQCN, level, null, message, throwable);
1628     }
1629
1630     @Override
1631     public void log(final Level level, final CharSequence message) {
1632         logIfEnabled(FQCN, level, null, message, null);
1633     }
1634
1635     @Override
1636     public void log(final Level level, final CharSequence message, final Throwable throwable) {
1637         logIfEnabled(FQCN, level, null, message, throwable);
1638     }
1639
1640     @Override
1641     public void log(final Level level, final Object message) {
1642         logIfEnabled(FQCN, level, null, message, null);
1643     }
1644
1645     @Override
1646     public void log(final Level level, final Object message, final Throwable throwable) {
1647         logIfEnabled(FQCN, level, null, message, throwable);
1648     }
1649
1650     @Override
1651     public void log(final Level level, final String message) {
1652         logIfEnabled(FQCN, level, null, message, (Throwable) null);
1653     }
1654
1655     @Override
1656     public void log(final Level level, final String message, final Object... params) {
1657         logIfEnabled(FQCN, level, null, message, params);
1658     }
1659
1660     @Override
1661     public void log(final Level level, final String message, final Throwable throwable) {
1662         logIfEnabled(FQCN, level, null, message, throwable);
1663     }
1664
1665     @Override
1666     public void log(final Level level, final Supplier<?> messageSupplier) {
1667         logIfEnabled(FQCN, level, null, messageSupplier, (Throwable) null);
1668     }
1669
1670     @Override
1671     public void log(final Level level, final Supplier<?> messageSupplier, final Throwable throwable) {
1672         logIfEnabled(FQCN, level, null, messageSupplier, throwable);
1673     }
1674
1675     @Override
1676     public void log(final Level level, final Marker marker, final Supplier<?> messageSupplier) {
1677         logIfEnabled(FQCN, level, marker, messageSupplier, (Throwable) null);
1678     }
1679
1680     @Override
1681     public void log(final Level level, final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1682         logIfEnabled(FQCN, level, marker, message, paramSuppliers);
1683     }
1684
1685     @Override
1686     public void log(final Level level, final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
1687         logIfEnabled(FQCN, level, marker, messageSupplier, throwable);
1688     }
1689
1690     @Override
1691     public void log(final Level level, final String message, final Supplier<?>... paramSuppliers) {
1692         logIfEnabled(FQCN, level, null, message, paramSuppliers);
1693     }
1694
1695     @Override
1696     public void log(final Level level, final Marker marker, final MessageSupplier messageSupplier) {
1697         logIfEnabled(FQCN, level, marker, messageSupplier, (Throwable) null);
1698     }
1699
1700     @Override
1701     public void log(final Level level, final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
1702         logIfEnabled(FQCN, level, marker, messageSupplier, throwable);
1703     }
1704
1705     @Override
1706     public void log(final Level level, final MessageSupplier messageSupplier) {
1707         logIfEnabled(FQCN, level, null, messageSupplier, (Throwable) null);
1708     }
1709
1710     @Override
1711     public void log(final Level level, final MessageSupplier messageSupplier, final Throwable throwable) {
1712         logIfEnabled(FQCN, level, null, messageSupplier, throwable);
1713     }
1714
1715     @Override
1716     public void log(final Level level, final Marker marker, final String message, final Object p0) {
1717         logIfEnabled(FQCN, level, marker, message, p0);
1718     }
1719
1720     @Override
1721     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1) {
1722         logIfEnabled(FQCN, level, marker, message, p0, p1);
1723     }
1724
1725     @Override
1726     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1727             final Object p2) {
1728         logIfEnabled(FQCN, level, marker, message, p0, p1, p2);
1729     }
1730
1731     @Override
1732     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1733             final Object p2, final Object p3) {
1734         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3);
1735     }
1736
1737     @Override
1738     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1739             final Object p2, final Object p3, final Object p4) {
1740         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4);
1741     }
1742
1743     @Override
1744     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1745             final Object p2, final Object p3, final Object p4, final Object p5) {
1746         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5);
1747     }
1748
1749     @Override
1750     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1751             final Object p2, final Object p3, final Object p4, final Object p5, final Object p6) {
1752         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6);
1753     }
1754
1755     @Override
1756     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1757             final Object p2, final Object p3, final Object p4, final Object p5,
1758             final Object p6, final Object p7) {
1759         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1760     }
1761
1762     @Override
1763     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1764             final Object p2, final Object p3, final Object p4, final Object p5,
1765             final Object p6, final Object p7, final Object p8) {
1766         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1767     }
1768
1769     @Override
1770     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1771             final Object p2, final Object p3, final Object p4, final Object p5,
1772             final Object p6, final Object p7, final Object p8, final Object p9) {
1773         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1774     }
1775
1776     @Override
1777     public void log(final Level level, final String message, final Object p0) {
1778         logIfEnabled(FQCN, level, null, message, p0);
1779     }
1780
1781     @Override
1782     public void log(final Level level, final String message, final Object p0, final Object p1) {
1783         logIfEnabled(FQCN, level, null, message, p0, p1);
1784     }
1785
1786     @Override
1787     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2) {
1788         logIfEnabled(FQCN, level, null, message, p0, p1, p2);
1789     }
1790
1791     @Override
1792     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1793         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3);
1794     }
1795
1796     @Override
1797     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1798             final Object p4) {
1799         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4);
1800     }
1801
1802     @Override
1803     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1804             final Object p4, final Object p5) {
1805         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5);
1806     }
1807
1808     @Override
1809     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1810             final Object p4, final Object p5, final Object p6) {
1811         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6);
1812     }
1813
1814     @Override
1815     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1816             final Object p4, final Object p5, final Object p6, final Object p7) {
1817         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1818     }
1819
1820     @Override
1821     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1822             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
1823         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1824     }
1825
1826     @Override
1827     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1828             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
1829         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1830     }
1831
1832     @Override
1833     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Message message,
1834             final Throwable throwable) {
1835         if (isEnabled(level, marker, message, throwable)) {
1836             logMessageSafely(fqcn, level, marker, message, throwable);
1837         }
1838     }
1839
1840     @Override
1841     public void logIfEnabled(final String fqcn, final Level level, final Marker marker,
1842             final MessageSupplier messageSupplier, final Throwable throwable) {
1843         if (isEnabled(level, marker, messageSupplier, throwable)) {
1844             logMessage(fqcn, level, marker, messageSupplier, throwable);
1845         }
1846     }
1847
1848     @Override
1849     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Object message,
1850             final Throwable throwable) {
1851         if (isEnabled(level, marker, message, throwable)) {
1852             logMessage(fqcn, level, marker, message, throwable);
1853         }
1854     }
1855
1856     @Override
1857     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final CharSequence message,
1858             final Throwable throwable) {
1859         if (isEnabled(level, marker, message, throwable)) {
1860             logMessage(fqcn, level, marker, message, throwable);
1861         }
1862     }
1863
1864     @Override
1865     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Supplier<?> messageSupplier,
1866             final Throwable throwable) {
1867         if (isEnabled(level, marker, messageSupplier, throwable)) {
1868             logMessage(fqcn, level, marker, messageSupplier, throwable);
1869         }
1870     }
1871
1872     @Override
1873     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message) {
1874         if (isEnabled(level, marker, message)) {
1875             logMessage(fqcn, level, marker, message);
1876         }
1877     }
1878
1879     @Override
1880     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1881             final Supplier<?>... paramSuppliers) {
1882         if (isEnabled(level, marker, message)) {
1883             logMessage(fqcn, level, marker, message, paramSuppliers);
1884         }
1885     }
1886
1887     @Override
1888     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1889             final Object... params) {
1890         if (isEnabled(level, marker, message, params)) {
1891             logMessage(fqcn, level, marker, message, params);
1892         }
1893     }
1894
1895     @Override
1896     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1897             final Object p0) {
1898         if (isEnabled(level, marker, message, p0)) {
1899             logMessage(fqcn, level, marker, message, p0);
1900         }
1901     }
1902
1903     @Override
1904     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1905             final Object p0, final Object p1) {
1906         if (isEnabled(level, marker, message, p0, p1)) {
1907             logMessage(fqcn, level, marker, message, p0, p1);
1908         }
1909     }
1910
1911     @Override
1912     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1913             final Object p0, final Object p1, final Object p2) {
1914         if (isEnabled(level, marker, message, p0, p1, p2)) {
1915             logMessage(fqcn, level, marker, message, p0, p1, p2);
1916         }
1917     }
1918
1919     @Override
1920     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1921             final Object p0, final Object p1, final Object p2, final Object p3) {
1922         if (isEnabled(level, marker, message, p0, p1, p2, p3)) {
1923             logMessage(fqcn, level, marker, message, p0, p1, p2, p3);
1924         }
1925     }
1926
1927     @Override
1928     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1929             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4) {
1930         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4)) {
1931             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4);
1932         }
1933     }
1934
1935     @Override
1936     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1937             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5) {
1938         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5)) {
1939             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5);
1940         }
1941     }
1942
1943     @Override
1944     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1945             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1946             final Object p6) {
1947         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6)) {
1948             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6);
1949         }
1950     }
1951
1952     @Override
1953     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1954             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1955             final Object p6, final Object p7) {
1956         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7)) {
1957             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1958         }
1959     }
1960
1961     @Override
1962     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1963             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1964             final Object p6, final Object p7, final Object p8) {
1965         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
1966             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1967         }
1968     }
1969
1970     @Override
1971     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1972             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1973             final Object p6, final Object p7, final Object p8, final Object p9) {
1974         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
1975             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1976         }
1977     }
1978
1979     @Override
1980     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1981             final Throwable throwable) {
1982         if (isEnabled(level, marker, message, throwable)) {
1983             logMessage(fqcn, level, marker, message, throwable);
1984         }
1985     }
1986
1987     protected void logMessage(final String fqcn, final Level level, final Marker marker, final CharSequence message,
1988             final Throwable throwable) {
1989         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), throwable);
1990     }
1991
1992     protected void logMessage(final String fqcn, final Level level, final Marker marker, final Object message,
1993             final Throwable throwable) {
1994         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), throwable);
1995     }
1996
1997     protected void logMessage(final String fqcn, final Level level, final Marker marker,
1998             final MessageSupplier messageSupplier, final Throwable throwable) {
1999         final Message message = LambdaUtil.get(messageSupplier);
2000         final Throwable effectiveThrowable = (throwable == null && message != null)
2001                 ? message.getThrowable()
2002                 : throwable;
2003         logMessageSafely(fqcn, level, marker, message, effectiveThrowable);
2004     }
2005
2006     protected void logMessage(final String fqcn, final Level level, final Marker marker, final Supplier<?> messageSupplier,
2007             final Throwable throwable) {
2008         final Message message = LambdaUtil.getMessage(messageSupplier, messageFactory);
2009         final Throwable effectiveThrowable = (throwable == null && message != null)
2010                 ? message.getThrowable()
2011                 : throwable;
2012         logMessageSafely(fqcn, level, marker, message, effectiveThrowable);
2013     }
2014
2015     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2016             final Throwable throwable) {
2017         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), throwable);
2018     }
2019
2020     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message) {
2021         final Message msg = messageFactory.newMessage(message);
2022         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2023     }
2024
2025     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2026             final Object... params) {
2027         final Message msg = messageFactory.newMessage(message, params);
2028         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2029     }
2030
2031     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2032             final Object p0) {
2033         final Message msg = messageFactory.newMessage(message, p0);
2034         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2035     }
2036
2037     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2038             final Object p0, final Object p1) {
2039         final Message msg = messageFactory.newMessage(message, p0, p1);
2040         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2041     }
2042
2043     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2044             final Object p0, final Object p1, final Object p2) {
2045         final Message msg = messageFactory.newMessage(message, p0, p1, p2);
2046         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2047     }
2048
2049     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2050             final Object p0, final Object p1, final Object p2, final Object p3) {
2051         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3);
2052         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2053     }
2054
2055     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2056             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4) {
2057         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4);
2058         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2059     }
2060
2061     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2062             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5) {
2063         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5);
2064         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2065     }
2066
2067     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2068             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2069             final Object p6) {
2070         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6);
2071         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2072     }
2073
2074     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2075             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2076             final Object p6, final Object p7) {
2077         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7);
2078         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2079     }
2080
2081     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2082             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2083             final Object p6, final Object p7, final Object p8) {
2084         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2085         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2086     }
2087
2088     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2089             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2090             final Object p6, final Object p7, final Object p8, final Object p9) {
2091         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2092         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2093     }
2094
2095     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2096             final Supplier<?>... paramSuppliers) {
2097         final Message msg = messageFactory.newMessage(message, LambdaUtil.getAll(paramSuppliers));
2098         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2099     }
2100
2101     @Override
2102     public void logMessage(final Level level, final Marker marker, final String fqcn, final StackTraceElement location,
2103         final Message message, final Throwable throwable) {
2104         try {
2105             incrementRecursionDepth();
2106             log(level, marker, fqcn, location, message, throwable);
2107         } catch (Throwable ex) {
2108             handleLogMessageException(ex, fqcn, message);
2109         } finally {
2110             decrementRecursionDepth();
2111             ReusableMessageFactory.release(message);
2112         }
2113     }
2114
2115     protected void log(final Level level, final Marker marker, final String fqcn, final StackTraceElement location,
2116         final Message message, final Throwable throwable) {
2117         logMessage(fqcn, level, marker, message, throwable);
2118     }
2119
2120     @Override
2121     public void printf(final Level level, final Marker marker, final String format, final Object... params) {
2122         if (isEnabled(level, marker, format, params)) {
2123             final Message message = new StringFormattedMessage(format, params);
2124             logMessageSafely(FQCN, level, marker, message, message.getThrowable());
2125         }
2126     }
2127
2128     @Override
2129     public void printf(final Level level, final String format, final Object... params) {
2130         if (isEnabled(level, null, format, params)) {
2131             final Message message = new StringFormattedMessage(format, params);
2132             logMessageSafely(FQCN, level, null, message, message.getThrowable());
2133         }
2134     }
2135
2136     @PerformanceSensitive
2137     // NOTE: This is a hot method. Current implementation compiles to 30 bytes of byte code.
2138     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2139     private void logMessageSafely(final String fqcn, final Level level, final Marker marker, final Message message,
2140             final Throwable throwable) {
2141         try {
2142             logMessageTrackRecursion(fqcn, level, marker, message, throwable);
2143         } finally {
2144             // LOG4J2-1583 prevent scrambled logs when logging calls are nested (logging in toString())
2145             ReusableMessageFactory.release(message);
2146         }
2147     }
2148
2149     @PerformanceSensitive
2150     // NOTE: This is a hot method. Current implementation compiles to 33 bytes of byte code.
2151     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2152     private void logMessageTrackRecursion(final String fqcn,
2153                                           final Level level,
2154                                           final Marker marker,
2155                                           final Message message,
2156                                           final Throwable throwable) {
2157         try {
2158             incrementRecursionDepth(); // LOG4J2-1518, LOG4J2-2031
2159             tryLogMessage(fqcn, getLocation(fqcn), level, marker, message, throwable);
2160         } finally {
2161             decrementRecursionDepth();
2162         }
2163     }
2164
2165     private static int[] getRecursionDepthHolder() {
2166         int[] result = recursionDepthHolder.get();
2167         if (result == null) {
2168             result = new int[1];
2169             recursionDepthHolder.set(result);
2170         }
2171         return result;
2172     }
2173
2174     private static void incrementRecursionDepth() {
2175         getRecursionDepthHolder()[0]++;
2176     }
2177
2178     private static void decrementRecursionDepth() {
2179         int newDepth = --getRecursionDepthHolder()[0];
2180         if (newDepth < 0) {
2181             throw new IllegalStateException("Recursion depth became negative: " + newDepth);
2182         }
2183     }
2184
2185     /**
2186      * Returns the depth of nested logging calls in the current Thread: zero if no logging call has been made,
2187      * one if a single logging call without nested logging calls has been made, or more depending on the level of
2188      * nesting.
2189      * @return the depth of the nested logging calls in the current Thread
2190      */

2191     public static int getRecursionDepth() {
2192         return getRecursionDepthHolder()[0];
2193     }
2194
2195     @PerformanceSensitive
2196     // NOTE: This is a hot method. Current implementation compiles to 26 bytes of byte code.
2197     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2198     private void tryLogMessage(final String fqcn,
2199                                final StackTraceElement location,
2200                                final Level level,
2201                                final Marker marker,
2202                                final Message message,
2203                                final Throwable throwable) {
2204         try {
2205             log(level, marker, fqcn, location, message, throwable);
2206         } catch (final Throwable t) {
2207             // LOG4J2-1990 Log4j2 suppresses all exceptions that occur once application called the logger
2208             handleLogMessageException(t, fqcn, message);
2209         }
2210     }
2211
2212     @PerformanceSensitive
2213     // NOTE: This is a hot method. Current implementation compiles to 15 bytes of byte code.
2214     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2215     private StackTraceElement getLocation(String fqcn) {
2216         return requiresLocation() ? StackLocatorUtil.calcLocation(fqcn) : null;
2217     }
2218
2219     // LOG4J2-1990 Log4j2 suppresses all exceptions that occur once application called the logger
2220     // TODO Configuration setting to propagate exceptions back to the caller *if requested*
2221     private void handleLogMessageException(final Throwable throwable, final String fqcn, final Message message) {
2222         if (throwable instanceof LoggingException) {
2223             throw (LoggingException) throwable;
2224         }
2225         StatusLogger.getLogger().warn("{} caught {} logging {}: {}",
2226                 fqcn,
2227                 throwable.getClass().getName(),
2228                 message.getClass().getSimpleName(),
2229                 message.getFormat(),
2230                 throwable);
2231     }
2232
2233     @Override
2234     public <T extends Throwable> T throwing(final T throwable) {
2235         return throwing(FQCN, Level.ERROR, throwable);
2236     }
2237
2238     @Override
2239     public <T extends Throwable> T throwing(final Level level, final T throwable) {
2240         return throwing(FQCN, level, throwable);
2241     }
2242
2243     /**
2244      * Logs a Throwable to be thrown.
2245      *
2246      * @param <T> the type of the Throwable.
2247      * @param fqcn the fully qualified class name of this Logger implementation.
2248      * @param level The logging Level.
2249      * @param throwable The Throwable.
2250      * @return the Throwable.
2251      */

2252     protected <T extends Throwable> T throwing(final String fqcn, final Level level, final T throwable) {
2253         if (isEnabled(level, THROWING_MARKER, (Object) nullnull)) {
2254             logMessageSafely(fqcn, level, THROWING_MARKER, throwingMsg(throwable), throwable);
2255         }
2256         return throwable;
2257     }
2258
2259     protected Message throwingMsg(final Throwable throwable) {
2260         return messageFactory.newMessage(THROWING);
2261     }
2262
2263     @Override
2264     public void trace(final Marker marker, final Message message) {
2265         logIfEnabled(FQCN, Level.TRACE, marker, message, message != null ? message.getThrowable() : null);
2266     }
2267
2268     @Override
2269     public void trace(final Marker marker, final Message message, final Throwable throwable) {
2270         logIfEnabled(FQCN, Level.TRACE, marker, message, throwable);
2271     }
2272
2273     @Override
2274     public void trace(final Marker marker, final CharSequence message) {
2275         logIfEnabled(FQCN, Level.TRACE, marker, message, null);
2276     }
2277
2278     @Override
2279     public void trace(final Marker marker, final CharSequence message, final Throwable throwable) {
2280         logIfEnabled(FQCN, Level.TRACE, marker, message, throwable);
2281     }
2282
2283     @Override
2284     public void trace(final Marker marker, final Object message) {
2285         logIfEnabled(FQCN, Level.TRACE, marker, message, null);
2286     }
2287
2288     @Override
2289     public void trace(final Marker marker, final Object message, final Throwable throwable) {
2290         logIfEnabled(FQCN, Level.TRACE, marker, message, throwable);
2291     }
2292
2293     @Override
2294     public void trace(final Marker marker, final String message) {
2295         logIfEnabled(FQCN, Level.TRACE, marker, message, (Throwable) null);
2296     }
2297
2298     @Override
2299     public void trace(final Marker marker, final String message, final Object... params) {
2300         logIfEnabled(FQCN, Level.TRACE, marker, message, params);
2301     }
2302
2303     @Override
2304     public void trace(final Marker marker, final String message, final Throwable throwable) {
2305         logIfEnabled(FQCN, Level.TRACE, marker, message, throwable);
2306     }
2307
2308     @Override
2309     public void trace(final Message message) {
2310         logIfEnabled(FQCN, Level.TRACE, null, message, message != null ? message.getThrowable() : null);
2311     }
2312
2313     @Override
2314     public void trace(final Message message, final Throwable throwable) {
2315         logIfEnabled(FQCN, Level.TRACE, null, message, throwable);
2316     }
2317
2318     @Override
2319     public void trace(final CharSequence message) {
2320         logIfEnabled(FQCN, Level.TRACE, null, message, null);
2321     }
2322
2323     @Override
2324     public void trace(final CharSequence message, final Throwable throwable) {
2325         logIfEnabled(FQCN, Level.TRACE, null, message, throwable);
2326     }
2327
2328     @Override
2329     public void trace(final Object message) {
2330         logIfEnabled(FQCN, Level.TRACE, null, message, null);
2331     }
2332
2333     @Override
2334     public void trace(final Object message, final Throwable throwable) {
2335         logIfEnabled(FQCN, Level.TRACE, null, message, throwable);
2336     }
2337
2338     @Override
2339     public void trace(final String message) {
2340         logIfEnabled(FQCN, Level.TRACE, null, message, (Throwable) null);
2341     }
2342
2343     @Override
2344     public void trace(final String message, final Object... params) {
2345         logIfEnabled(FQCN, Level.TRACE, null, message, params);
2346     }
2347
2348     @Override
2349     public void trace(final String message, final Throwable throwable) {
2350         logIfEnabled(FQCN, Level.TRACE, null, message, throwable);
2351     }
2352
2353     @Override
2354     public void trace(final Supplier<?> messageSupplier) {
2355         logIfEnabled(FQCN, Level.TRACE, null, messageSupplier, (Throwable) null);
2356     }
2357
2358     @Override
2359     public void trace(final Supplier<?> messageSupplier, final Throwable throwable) {
2360         logIfEnabled(FQCN, Level.TRACE, null, messageSupplier, throwable);
2361     }
2362
2363     @Override
2364     public void trace(final Marker marker, final Supplier<?> messageSupplier) {
2365         logIfEnabled(FQCN, Level.TRACE, marker, messageSupplier, (Throwable) null);
2366     }
2367
2368     @Override
2369     public void trace(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
2370         logIfEnabled(FQCN, Level.TRACE, marker, message, paramSuppliers);
2371     }
2372
2373     @Override
2374     public void trace(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
2375         logIfEnabled(FQCN, Level.TRACE, marker, messageSupplier, throwable);
2376     }
2377
2378     @Override
2379     public void trace(final String message, final Supplier<?>... paramSuppliers) {
2380         logIfEnabled(FQCN, Level.TRACE, null, message, paramSuppliers);
2381     }
2382
2383     @Override
2384     public void trace(final Marker marker, final MessageSupplier messageSupplier) {
2385         logIfEnabled(FQCN, Level.TRACE, marker, messageSupplier, (Throwable) null);
2386     }
2387
2388     @Override
2389     public void trace(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
2390         logIfEnabled(FQCN, Level.TRACE, marker, messageSupplier, throwable);
2391     }
2392
2393     @Override
2394     public void trace(final MessageSupplier messageSupplier) {
2395         logIfEnabled(FQCN, Level.TRACE, null, messageSupplier, (Throwable) null);
2396     }
2397
2398     @Override
2399     public void trace(final MessageSupplier messageSupplier, final Throwable throwable) {
2400         logIfEnabled(FQCN, Level.TRACE, null, messageSupplier, throwable);
2401     }
2402
2403     @Override
2404     public void trace(final Marker marker, final String message, final Object p0) {
2405         logIfEnabled(FQCN, Level.TRACE, marker, message, p0);
2406     }
2407
2408     @Override
2409     public void trace(final Marker marker, final String message, final Object p0, final Object p1) {
2410         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1);
2411     }
2412
2413     @Override
2414     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
2415         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2);
2416     }
2417
2418     @Override
2419     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2420             final Object p3) {
2421         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3);
2422     }
2423
2424     @Override
2425     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2426             final Object p3, final Object p4) {
2427         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4);
2428     }
2429
2430     @Override
2431     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2432             final Object p3, final Object p4, final Object p5) {
2433         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5);
2434     }
2435
2436     @Override
2437     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2438             final Object p3, final Object p4, final Object p5, final Object p6) {
2439         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6);
2440     }
2441
2442     @Override
2443     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2444             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
2445         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
2446     }
2447
2448     @Override
2449     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2450             final Object p3, final Object p4, final Object p5,
2451             final Object p6, final Object p7, final Object p8) {
2452         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2453     }
2454
2455     @Override
2456     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2457             final Object p3, final Object p4, final Object p5,
2458             final Object p6, final Object p7, final Object p8, final Object p9) {
2459         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2460     }
2461
2462     @Override
2463     public void trace(final String message, final Object p0) {
2464         logIfEnabled(FQCN, Level.TRACE, null, message, p0);
2465     }
2466
2467     @Override
2468     public void trace(final String message, final Object p0, final Object p1) {
2469         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1);
2470     }
2471
2472     @Override
2473     public void trace(final String message, final Object p0, final Object p1, final Object p2) {
2474         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2);
2475     }
2476
2477     @Override
2478     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
2479         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3);
2480     }
2481
2482     @Override
2483     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2484             final Object p4) {
2485         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4);
2486     }
2487
2488     @Override
2489     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2490             final Object p4, final Object p5) {
2491         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5);
2492     }
2493
2494     @Override
2495     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2496             final Object p4, final Object p5, final Object p6) {
2497         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6);
2498     }
2499
2500     @Override
2501     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2502             final Object p4, final Object p5, final Object p6, final Object p7) {
2503         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
2504     }
2505
2506     @Override
2507     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2508             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2509         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2510     }
2511
2512     @Override
2513     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2514             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
2515         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2516     }
2517
2518     @Override
2519     public EntryMessage traceEntry() {
2520         return enter(FQCN, null, (Object[]) null);
2521     }
2522
2523     @Override
2524     public EntryMessage traceEntry(final String format, final Object... params) {
2525         return enter(FQCN, format, params);
2526     }
2527
2528     @Override
2529     public EntryMessage traceEntry(final Supplier<?>... paramSuppliers) {
2530         return enter(FQCN, null, paramSuppliers);
2531     }
2532
2533     @Override
2534     public EntryMessage traceEntry(final String format, final Supplier<?>... paramSuppliers) {
2535         return enter(FQCN, format, paramSuppliers);
2536     }
2537
2538     @Override
2539     public EntryMessage traceEntry(final Message message) {
2540         return enter(FQCN, message);
2541     }
2542
2543     @Override
2544     public void traceExit() {
2545         exit(FQCN, nullnull);
2546     }
2547
2548     @Override
2549     public <R> R traceExit(final R result) {
2550         return exit(FQCN, null, result);
2551     }
2552
2553     @Override
2554     public <R> R traceExit(final String format, final R result) {
2555         return exit(FQCN, format, result);
2556     }
2557
2558     @Override
2559     public void traceExit(final EntryMessage message) {
2560         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2561         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2562             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(message), null);
2563         }
2564     }
2565
2566     @Override
2567     public <R> R traceExit(final EntryMessage message, final R result) {
2568         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2569         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2570             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(result, message), null);
2571         }
2572         return result;
2573     }
2574
2575     @Override
2576     public <R> R traceExit(final Message message, final R result) {
2577         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2578         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2579             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(result, message), null);
2580         }
2581         return result;
2582     }
2583
2584     @Override
2585     public void warn(final Marker marker, final Message message) {
2586         logIfEnabled(FQCN, Level.WARN, marker, message, message != null ? message.getThrowable() : null);
2587     }
2588
2589     @Override
2590     public void warn(final Marker marker, final Message message, final Throwable throwable) {
2591         logIfEnabled(FQCN, Level.WARN, marker, message, throwable);
2592     }
2593
2594     @Override
2595     public void warn(final Marker marker, final CharSequence message) {
2596         logIfEnabled(FQCN, Level.WARN, marker, message, null);
2597     }
2598
2599     @Override
2600     public void warn(final Marker marker, final CharSequence message, final Throwable throwable) {
2601         logIfEnabled(FQCN, Level.WARN, marker, message, throwable);
2602     }
2603
2604     @Override
2605     public void warn(final Marker marker, final Object message) {
2606         logIfEnabled(FQCN, Level.WARN, marker, message, null);
2607     }
2608
2609     @Override
2610     public void warn(final Marker marker, final Object message, final Throwable throwable) {
2611         logIfEnabled(FQCN, Level.WARN, marker, message, throwable);
2612     }
2613
2614     @Override
2615     public void warn(final Marker marker, final String message) {
2616         logIfEnabled(FQCN, Level.WARN, marker, message, (Throwable) null);
2617     }
2618
2619     @Override
2620     public void warn(final Marker marker, final String message, final Object... params) {
2621         logIfEnabled(FQCN, Level.WARN, marker, message, params);
2622     }
2623
2624     @Override
2625     public void warn(final Marker marker, final String message, final Throwable throwable) {
2626         logIfEnabled(FQCN, Level.WARN, marker, message, throwable);
2627     }
2628
2629     @Override
2630     public void warn(final Message message) {
2631         logIfEnabled(FQCN, Level.WARN, null, message, message != null ? message.getThrowable() : null);
2632     }
2633
2634     @Override
2635     public void warn(final Message message, final Throwable throwable) {
2636         logIfEnabled(FQCN, Level.WARN, null, message, throwable);
2637     }
2638
2639     @Override
2640     public void warn(final CharSequence message) {
2641         logIfEnabled(FQCN, Level.WARN, null, message, null);
2642     }
2643
2644     @Override
2645     public void warn(final CharSequence message, final Throwable throwable) {
2646         logIfEnabled(FQCN, Level.WARN, null, message, throwable);
2647     }
2648
2649     @Override
2650     public void warn(final Object message) {
2651         logIfEnabled(FQCN, Level.WARN, null, message, null);
2652     }
2653
2654     @Override
2655     public void warn(final Object message, final Throwable throwable) {
2656         logIfEnabled(FQCN, Level.WARN, null, message, throwable);
2657     }
2658
2659     @Override
2660     public void warn(final String message) {
2661         logIfEnabled(FQCN, Level.WARN, null, message, (Throwable) null);
2662     }
2663
2664     @Override
2665     public void warn(final String message, final Object... params) {
2666         logIfEnabled(FQCN, Level.WARN, null, message, params);
2667     }
2668
2669     @Override
2670     public void warn(final String message, final Throwable throwable) {
2671         logIfEnabled(FQCN, Level.WARN, null, message, throwable);
2672     }
2673
2674     @Override
2675     public void warn(final Supplier<?> messageSupplier) {
2676         logIfEnabled(FQCN, Level.WARN, null, messageSupplier, (Throwable) null);
2677     }
2678
2679     @Override
2680     public void warn(final Supplier<?> messageSupplier, final Throwable throwable) {
2681         logIfEnabled(FQCN, Level.WARN, null, messageSupplier, throwable);
2682     }
2683
2684     @Override
2685     public void warn(final Marker marker, final Supplier<?> messageSupplier) {
2686         logIfEnabled(FQCN, Level.WARN, marker, messageSupplier, (Throwable) null);
2687     }
2688
2689     @Override
2690     public void warn(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
2691         logIfEnabled(FQCN, Level.WARN, marker, message, paramSuppliers);
2692     }
2693
2694     @Override
2695     public void warn(final Marker marker, final Supplier<?> messageSupplier, final Throwable throwable) {
2696         logIfEnabled(FQCN, Level.WARN, marker, messageSupplier, throwable);
2697     }
2698
2699     @Override
2700     public void warn(final String message, final Supplier<?>... paramSuppliers) {
2701         logIfEnabled(FQCN, Level.WARN, null, message, paramSuppliers);
2702     }
2703
2704     @Override
2705     public void warn(final Marker marker, final MessageSupplier messageSupplier) {
2706         logIfEnabled(FQCN, Level.WARN, marker, messageSupplier, (Throwable) null);
2707     }
2708
2709     @Override
2710     public void warn(final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable) {
2711         logIfEnabled(FQCN, Level.WARN, marker, messageSupplier, throwable);
2712     }
2713
2714     @Override
2715     public void warn(final MessageSupplier messageSupplier) {
2716         logIfEnabled(FQCN, Level.WARN, null, messageSupplier, (Throwable) null);
2717     }
2718
2719     @Override
2720     public void warn(final MessageSupplier messageSupplier, final Throwable throwable) {
2721         logIfEnabled(FQCN, Level.WARN, null, messageSupplier, throwable);
2722     }
2723
2724     @Override
2725     public void warn(final Marker marker, final String message, final Object p0) {
2726         logIfEnabled(FQCN, Level.WARN, marker, message, p0);
2727     }
2728
2729     @Override
2730     public void warn(final Marker marker, final String message, final Object p0, final Object p1) {
2731         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1);
2732     }
2733
2734     @Override
2735     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
2736         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2);
2737     }
2738
2739     @Override
2740     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2741             final Object p3) {
2742         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3);
2743     }
2744
2745     @Override
2746     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2747             final Object p3, final Object p4) {
2748         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4);
2749     }
2750
2751     @Override
2752     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2753             final Object p3, final Object p4, final Object p5) {
2754         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5);
2755     }
2756
2757     @Override
2758     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2759             final Object p3, final Object p4, final Object p5, final Object p6) {
2760         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6);
2761     }
2762
2763     @Override
2764     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2765             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
2766         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
2767     }
2768
2769     @Override
2770     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2771             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2772         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2773     }
2774
2775     @Override
2776     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2777             final Object p3, final Object p4, final Object p5,
2778             final Object p6, final Object p7, final Object p8, final Object p9) {
2779         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2780     }
2781
2782     @Override
2783     public void warn(final String message, final Object p0) {
2784         logIfEnabled(FQCN, Level.WARN, null, message, p0);
2785     }
2786
2787     @Override
2788     public void warn(final String message, final Object p0, final Object p1) {
2789         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1);
2790     }
2791
2792     @Override
2793     public void warn(final String message, final Object p0, final Object p1, final Object p2) {
2794         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2);
2795     }
2796
2797     @Override
2798     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
2799         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3);
2800     }
2801
2802     @Override
2803     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2804             final Object p4) {
2805         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4);
2806     }
2807
2808     @Override
2809     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2810             final Object p4, final Object p5) {
2811         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5);
2812     }
2813
2814     @Override
2815     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2816             final Object p4, final Object p5, final Object p6) {
2817         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6);
2818     }
2819
2820     @Override
2821     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2822             final Object p4, final Object p5, final Object p6, final Object p7) {
2823         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
2824     }
2825
2826     @Override
2827     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2828             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2829         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2830     }
2831
2832     @Override
2833     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2834             final Object p4, final Object p5, final Object p6,
2835             final Object p7, final Object p8, final Object p9) {
2836         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2837     }
2838
2839     protected boolean requiresLocation() {
2840         return false;
2841     }
2842
2843     /**
2844      * Construct a trace log event.
2845      * @return a LogBuilder.
2846      * @since 2.13.0
2847      */

2848     @Override
2849     public LogBuilder atTrace() {
2850         return atLevel(Level.TRACE);
2851     }
2852
2853     /**
2854      * Construct a debug log event.
2855      * @return a LogBuilder.
2856      * @since 2.13.0
2857      */

2858     @Override
2859     public LogBuilder atDebug() {
2860         return atLevel(Level.DEBUG);
2861     }
2862     
2863     /**
2864      * Construct an informational log event.
2865      * @return a LogBuilder.
2866      * @since 2.13.0
2867      */

2868     @Override
2869     public LogBuilder atInfo() {
2870         return atLevel(Level.INFO);
2871     }
2872     
2873     /**
2874      * Construct a warning log event.
2875      * @return a LogBuilder.
2876      * @since 2.13.0
2877      */

2878     @Override
2879     public LogBuilder atWarn() {
2880         return atLevel(Level.WARN);
2881     }
2882     
2883     /**
2884      * Construct an error log event.
2885      * @return a LogBuilder.
2886      * @since 2.13.0
2887      */

2888     @Override
2889     public LogBuilder atError() {
2890         return atLevel(Level.ERROR);
2891     }
2892     
2893     /**
2894      * Construct a fatal log event.
2895      * @return a LogBuilder.
2896      * @since 2.13.0
2897      */

2898     @Override
2899     public LogBuilder atFatal() {
2900         return atLevel(Level.FATAL);
2901     }
2902     
2903     /**
2904      * Construct a log event that will always be logged.
2905      * @return a LogBuilder.
2906      * @since 2.13.0
2907      */

2908     @Override
2909     public LogBuilder always() {
2910         DefaultLogBuilder builder = logBuilder.get();
2911         if (builder.isInUse()) {
2912             return new DefaultLogBuilder(this);
2913         }
2914         return builder.reset(Level.OFF);
2915     }
2916     
2917     /**
2918      * Construct a log event.
2919      * @return a LogBuilder.
2920      * @since 2.13.0
2921      */

2922     @Override
2923     public LogBuilder atLevel(Level level) {
2924         if (isEnabled(level)) {
2925             return getLogBuilder(level).reset(level);
2926         }
2927         return LogBuilder.NOOP;
2928     }
2929
2930     private DefaultLogBuilder getLogBuilder(Level level) {
2931         DefaultLogBuilder builder = logBuilder.get();
2932         return Constants.ENABLE_THREADLOCALS && !builder.isInUse() ? builder : new DefaultLogBuilder(this, level);
2933     }
2934
2935     private void readObject (final ObjectInputStream s) throws ClassNotFoundException, IOException {
2936         s.defaultReadObject( );
2937         try {
2938             Field f = this.getClass().getDeclaredField("logBuilder");
2939             f.setAccessible(true);
2940             f.set(thisnew LocalLogBuilder(this));
2941         } catch (NoSuchFieldException | IllegalAccessException ex) {
2942             StatusLogger.getLogger().warn("Unable to initialize LogBuilder");
2943         }
2944     }
2945
2946     private class LocalLogBuilder extends ThreadLocal<DefaultLogBuilder> {
2947         private AbstractLogger logger;
2948         LocalLogBuilder(AbstractLogger logger) {
2949             this.logger = logger;
2950         }
2951
2952         @Override
2953         protected DefaultLogBuilder initialValue() {
2954             return new DefaultLogBuilder(logger);
2955         }
2956     }
2957 }
2958