View Javadoc
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.Serializable;
20  
21  import org.apache.logging.log4j.Level;
22  import org.apache.logging.log4j.LoggingException;
23  import org.apache.logging.log4j.Marker;
24  import org.apache.logging.log4j.MarkerManager;
25  import org.apache.logging.log4j.message.DefaultFlowMessageFactory;
26  import org.apache.logging.log4j.message.EntryMessage;
27  import org.apache.logging.log4j.message.FlowMessageFactory;
28  import org.apache.logging.log4j.message.Message;
29  import org.apache.logging.log4j.message.MessageFactory;
30  import org.apache.logging.log4j.message.MessageFactory2;
31  import org.apache.logging.log4j.message.ParameterizedMessage;
32  import org.apache.logging.log4j.message.ParameterizedMessageFactory;
33  import org.apache.logging.log4j.message.ReusableMessageFactory;
34  import org.apache.logging.log4j.message.SimpleMessage;
35  import org.apache.logging.log4j.message.StringFormattedMessage;
36  import org.apache.logging.log4j.status.StatusLogger;
37  import org.apache.logging.log4j.util.Constants;
38  import org.apache.logging.log4j.util.LambdaUtil;
39  import org.apache.logging.log4j.util.LoaderUtil;
40  import org.apache.logging.log4j.util.MessageSupplier;
41  import org.apache.logging.log4j.util.PerformanceSensitive;
42  import org.apache.logging.log4j.util.PropertiesUtil;
43  import org.apache.logging.log4j.util.StackLocatorUtil;
44  import org.apache.logging.log4j.util.Strings;
45  import org.apache.logging.log4j.util.Supplier;
46  
47  /**
48   * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class.
49   */
50  public abstract class AbstractLogger implements ExtendedLogger, LocationAwareLogger, Serializable {
51      // Implementation note: many methods in this class are tuned for performance. MODIFY WITH CARE!
52      // Specifically, try to keep the hot methods to 35 bytecodes or less:
53      // this is within the MaxInlineSize threshold on Java 7 and Java 8 Hotspot and makes these methods
54      // candidates for immediate inlining instead of waiting until they are designated "hot enough".
55  
56      /**
57       * Marker for flow tracing.
58       */
59      public static final Marker FLOW_MARKER = MarkerManager.getMarker("FLOW");
60  
61      /**
62       * Marker for method entry tracing.
63       */
64      public static final Marker ENTRY_MARKER = MarkerManager.getMarker("ENTER").setParents(FLOW_MARKER);
65  
66      /**
67       * Marker for method exit tracing.
68       */
69      public static final Marker EXIT_MARKER = MarkerManager.getMarker("EXIT").setParents(FLOW_MARKER);
70  
71      /**
72       * Marker for exception tracing.
73       */
74      public static final Marker EXCEPTION_MARKER = MarkerManager.getMarker("EXCEPTION");
75  
76      /**
77       * Marker for throwing exceptions.
78       */
79      public static final Marker THROWING_MARKER = MarkerManager.getMarker("THROWING").setParents(EXCEPTION_MARKER);
80  
81      /**
82       * Marker for catching exceptions.
83       */
84      public static final Marker CATCHING_MARKER = MarkerManager.getMarker("CATCHING").setParents(EXCEPTION_MARKER);
85  
86      /**
87       * The default MessageFactory class.
88       */
89      public static final Class<? extends MessageFactory> DEFAULT_MESSAGE_FACTORY_CLASS =
90              createClassForProperty("log4j2.messageFactory", ReusableMessageFactory.class,
91                      ParameterizedMessageFactory.class);
92  
93      /**
94       * The default FlowMessageFactory class.
95       */
96      public static final Class<? extends FlowMessageFactory> DEFAULT_FLOW_MESSAGE_FACTORY_CLASS =
97              createFlowClassForProperty("log4j2.flowMessageFactory", DefaultFlowMessageFactory.class);
98  
99      private static final long serialVersionUID = 2L;
100 
101     private static final String FQCN = AbstractLogger.class.getName();
102     private static final String THROWING = "Throwing";
103     private static final String CATCHING = "Catching";
104 
105     protected final String name;
106     private final MessageFactory2 messageFactory;
107     private final FlowMessageFactory flowMessageFactory;
108     private static ThreadLocal<int[]> recursionDepthHolder = new ThreadLocal<>(); // LOG4J2-1518, LOG4J2-2031
109 
110     /**
111      * Creates a new logger named after this class (or subclass).
112      */
113     public AbstractLogger() {
114         this.name = getClass().getName();
115         this.messageFactory = createDefaultMessageFactory();
116         this.flowMessageFactory = createDefaultFlowMessageFactory();
117     }
118 
119     /**
120      * Creates a new named logger.
121      *
122      * @param name the logger name
123      */
124     public AbstractLogger(final String name) {
125         this(name, createDefaultMessageFactory());
126     }
127 
128     /**
129      * Creates a new named logger with a particular {@link MessageFactory}.
130      *
131      * @param name the logger name
132      * @param messageFactory the message factory, if null then use the default message factory.
133      */
134     public AbstractLogger(final String name, final MessageFactory messageFactory) {
135         this.name = name;
136         this.messageFactory = messageFactory == null ? createDefaultMessageFactory() : narrow(messageFactory);
137         this.flowMessageFactory = createDefaultFlowMessageFactory();
138     }
139 
140     /**
141      * Checks that the message factory a logger was created with is the same as the given messageFactory. If they are
142      * different log a warning to the {@linkplain StatusLogger}. A null MessageFactory translates to the default
143      * MessageFactory {@link #DEFAULT_MESSAGE_FACTORY_CLASS}.
144      *
145      * @param logger The logger to check
146      * @param messageFactory The message factory to check.
147      */
148     public static void checkMessageFactory(final ExtendedLogger logger, final MessageFactory messageFactory) {
149         final String name = logger.getName();
150         final MessageFactory loggerMessageFactory = logger.getMessageFactory();
151         if (messageFactory != null && !loggerMessageFactory.equals(messageFactory)) {
152             StatusLogger.getLogger().warn(
153                     "The Logger {} was created with the message factory {} and is now requested with the "
154                             + "message factory {}, which may create log events with unexpected formatting.", name,
155                     loggerMessageFactory, messageFactory);
156         } else if (messageFactory == null && !loggerMessageFactory.getClass().equals(DEFAULT_MESSAGE_FACTORY_CLASS)) {
157             StatusLogger
158                     .getLogger()
159                     .warn("The Logger {} was created with the message factory {} and is now requested with a null "
160                             + "message factory (defaults to {}), which may create log events with unexpected "
161                             + "formatting.",
162                             name, loggerMessageFactory, DEFAULT_MESSAGE_FACTORY_CLASS.getName());
163         }
164     }
165 
166     @Override
167     public void catching(final Level level, final Throwable t) {
168         catching(FQCN, level, t);
169     }
170 
171     /**
172      * Logs a Throwable that has been caught with location information.
173      *
174      * @param fqcn The fully qualified class name of the <b>caller</b>.
175      * @param level The logging level.
176      * @param t The Throwable.
177      */
178     protected void catching(final String fqcn, final Level level, final Throwable t) {
179         if (isEnabled(level, CATCHING_MARKER, (Object) null, null)) {
180             logMessageSafely(fqcn, level, CATCHING_MARKER, catchingMsg(t), t);
181         }
182     }
183 
184     @Override
185     public void catching(final Throwable t) {
186         if (isEnabled(Level.ERROR, CATCHING_MARKER, (Object) null, null)) {
187             logMessageSafely(FQCN, Level.ERROR, CATCHING_MARKER, catchingMsg(t), t);
188         }
189     }
190 
191     protected Message catchingMsg(final Throwable t) {
192         return messageFactory.newMessage(CATCHING);
193     }
194 
195     private static Class<? extends MessageFactory> createClassForProperty(final String property,
196             final Class<ReusableMessageFactory> reusableParameterizedMessageFactoryClass,
197             final Class<ParameterizedMessageFactory> parameterizedMessageFactoryClass) {
198         try {
199             final String fallback = Constants.ENABLE_THREADLOCALS ? reusableParameterizedMessageFactoryClass.getName()
200                     : parameterizedMessageFactoryClass.getName();
201             final String clsName = PropertiesUtil.getProperties().getStringProperty(property, fallback);
202             return LoaderUtil.loadClass(clsName).asSubclass(MessageFactory.class);
203         } catch (final Throwable t) {
204             return parameterizedMessageFactoryClass;
205         }
206     }
207 
208     private static Class<? extends FlowMessageFactory> createFlowClassForProperty(final String property,
209             final Class<DefaultFlowMessageFactory> defaultFlowMessageFactoryClass) {
210         try {
211             final String clsName = PropertiesUtil.getProperties().getStringProperty(property, defaultFlowMessageFactoryClass.getName());
212             return LoaderUtil.loadClass(clsName).asSubclass(FlowMessageFactory.class);
213         } catch (final Throwable t) {
214             return defaultFlowMessageFactoryClass;
215         }
216     }
217 
218     private static MessageFactory2 createDefaultMessageFactory() {
219         try {
220             final MessageFactory result = DEFAULT_MESSAGE_FACTORY_CLASS.newInstance();
221             return narrow(result);
222         } catch (final InstantiationException | IllegalAccessException e) {
223             throw new IllegalStateException(e);
224         }
225     }
226 
227     private static MessageFactory2 narrow(final MessageFactory result) {
228         if (result instanceof MessageFactory2) {
229             return (MessageFactory2) result;
230         }
231         return new MessageFactory2Adapter(result);
232     }
233 
234     private static FlowMessageFactory createDefaultFlowMessageFactory() {
235         try {
236             return DEFAULT_FLOW_MESSAGE_FACTORY_CLASS.newInstance();
237         } catch (final InstantiationException | IllegalAccessException e) {
238             throw new IllegalStateException(e);
239         }
240     }
241 
242     @Override
243     public void debug(final Marker marker, final CharSequence message) {
244         logIfEnabled(FQCN, Level.DEBUG, marker, message, null);
245     }
246 
247     @Override
248     public void debug(final Marker marker, final CharSequence message, final Throwable t) {
249         logIfEnabled(FQCN, Level.DEBUG, marker, message, t);
250     }
251 
252     @Override
253     public void debug(final Marker marker, final Message msg) {
254         logIfEnabled(FQCN, Level.DEBUG, marker, msg, msg != null ? msg.getThrowable() : null);
255     }
256 
257     @Override
258     public void debug(final Marker marker, final Message msg, final Throwable t) {
259         logIfEnabled(FQCN, Level.DEBUG, marker, msg, t);
260     }
261 
262     @Override
263     public void debug(final Marker marker, final Object message) {
264         logIfEnabled(FQCN, Level.DEBUG, marker, message, null);
265     }
266 
267     @Override
268     public void debug(final Marker marker, final Object message, final Throwable t) {
269         logIfEnabled(FQCN, Level.DEBUG, marker, message, t);
270     }
271 
272     @Override
273     public void debug(final Marker marker, final String message) {
274         logIfEnabled(FQCN, Level.DEBUG, marker, message, (Throwable) null);
275     }
276 
277     @Override
278     public void debug(final Marker marker, final String message, final Object... params) {
279         logIfEnabled(FQCN, Level.DEBUG, marker, message, params);
280     }
281 
282     @Override
283     public void debug(final Marker marker, final String message, final Throwable t) {
284         logIfEnabled(FQCN, Level.DEBUG, marker, message, t);
285     }
286 
287     @Override
288     public void debug(final Message msg) {
289         logIfEnabled(FQCN, Level.DEBUG, null, msg, msg != null ? msg.getThrowable() : null);
290     }
291 
292     @Override
293     public void debug(final Message msg, final Throwable t) {
294         logIfEnabled(FQCN, Level.DEBUG, null, msg, t);
295     }
296 
297     @Override
298     public void debug(final CharSequence message) {
299         logIfEnabled(FQCN, Level.DEBUG, null, message, null);
300     }
301 
302     @Override
303     public void debug(final CharSequence message, final Throwable t) {
304         logIfEnabled(FQCN, Level.DEBUG, null, message, t);
305     }
306 
307     @Override
308     public void debug(final Object message) {
309         logIfEnabled(FQCN, Level.DEBUG, null, message, null);
310     }
311 
312     @Override
313     public void debug(final Object message, final Throwable t) {
314         logIfEnabled(FQCN, Level.DEBUG, null, message, t);
315     }
316 
317     @Override
318     public void debug(final String message) {
319         logIfEnabled(FQCN, Level.DEBUG, null, message, (Throwable) null);
320     }
321 
322     @Override
323     public void debug(final String message, final Object... params) {
324         logIfEnabled(FQCN, Level.DEBUG, null, message, params);
325     }
326 
327     @Override
328     public void debug(final String message, final Throwable t) {
329         logIfEnabled(FQCN, Level.DEBUG, null, message, t);
330     }
331 
332     @Override
333     public void debug(final Supplier<?> msgSupplier) {
334         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, (Throwable) null);
335     }
336 
337     @Override
338     public void debug(final Supplier<?> msgSupplier, final Throwable t) {
339         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t);
340     }
341 
342     @Override
343     public void debug(final Marker marker, final Supplier<?> msgSupplier) {
344         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, (Throwable) null);
345     }
346 
347     @Override
348     public void debug(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
349         logIfEnabled(FQCN, Level.DEBUG, marker, message, paramSuppliers);
350     }
351 
352     @Override
353     public void debug(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
354         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t);
355     }
356 
357     @Override
358     public void debug(final String message, final Supplier<?>... paramSuppliers) {
359         logIfEnabled(FQCN, Level.DEBUG, null, message, paramSuppliers);
360     }
361 
362     @Override
363     public void debug(final Marker marker, final MessageSupplier msgSupplier) {
364         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, (Throwable) null);
365     }
366 
367     @Override
368     public void debug(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
369         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t);
370     }
371 
372     @Override
373     public void debug(final MessageSupplier msgSupplier) {
374         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, (Throwable) null);
375     }
376 
377     @Override
378     public void debug(final MessageSupplier msgSupplier, final Throwable t) {
379         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t);
380     }
381 
382     @Override
383     public void debug(final Marker marker, final String message, final Object p0) {
384         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0);
385     }
386 
387     @Override
388     public void debug(final Marker marker, final String message, final Object p0, final Object p1) {
389         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1);
390     }
391 
392     @Override
393     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
394         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2);
395     }
396 
397     @Override
398     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
399             final Object p3) {
400         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3);
401     }
402 
403     @Override
404     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
405             final Object p3, final Object p4) {
406         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4);
407     }
408 
409     @Override
410     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
411             final Object p3, final Object p4, final Object p5) {
412         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5);
413     }
414 
415     @Override
416     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
417             final Object p3, final Object p4, final Object p5,
418             final Object p6) {
419         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6);
420     }
421 
422     @Override
423     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
424             final Object p3, final Object p4, final Object p5,
425             final Object p6, final Object p7) {
426         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
427     }
428 
429     @Override
430     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
431             final Object p3, final Object p4, final Object p5,
432             final Object p6, final Object p7, final Object p8) {
433         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
434     }
435 
436     @Override
437     public void debug(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
438             final Object p3, final Object p4, final Object p5,
439             final Object p6, final Object p7, final Object p8, final Object p9) {
440         logIfEnabled(FQCN, Level.DEBUG, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
441     }
442 
443     @Override
444     public void debug(final String message, final Object p0) {
445         logIfEnabled(FQCN, Level.DEBUG, null, message, p0);
446     }
447 
448     @Override
449     public void debug(final String message, final Object p0, final Object p1) {
450         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1);
451     }
452 
453     @Override
454     public void debug(final String message, final Object p0, final Object p1, final Object p2) {
455         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2);
456     }
457 
458     @Override
459     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
460         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3);
461     }
462 
463     @Override
464     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
465             final Object p4) {
466         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4);
467     }
468 
469     @Override
470     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
471             final Object p4, final Object p5) {
472         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5);
473     }
474 
475     @Override
476     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
477             final Object p4, final Object p5, final Object p6) {
478         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6);
479     }
480 
481     @Override
482     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
483             final Object p4, final Object p5, final Object p6,
484             final Object p7) {
485         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
486     }
487 
488     @Override
489     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
490             final Object p4, final Object p5, final Object p6,
491             final Object p7, final Object p8) {
492         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
493     }
494 
495     @Override
496     public void debug(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
497             final Object p4, final Object p5, final Object p6,
498             final Object p7, final Object p8, final Object p9) {
499         logIfEnabled(FQCN, Level.DEBUG, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
500     }
501 
502     /**
503      * Logs entry to a method with location information.
504      *
505      * @param fqcn The fully qualified class name of the <b>caller</b>.
506      * @param format Format String for the parameters.
507      * @param paramSuppliers The Suppliers of the parameters.
508      */
509     protected EntryMessage enter(final String fqcn, final String format, final Supplier<?>... paramSuppliers) {
510         EntryMessage entryMsg = null;
511         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
512             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, paramSuppliers), null);
513         }
514         return entryMsg;
515     }
516 
517     /**
518      * Logs entry to a method with location information.
519      *
520      * @param fqcn The fully qualified class name of the <b>caller</b>.
521      * @param format The format String for the parameters.
522      * @param paramSuppliers The parameters to the method.
523      */
524     @Deprecated
525     protected EntryMessage enter(final String fqcn, final String format, final MessageSupplier... paramSuppliers) {
526         EntryMessage entryMsg = null;
527         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
528             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, paramSuppliers), null);
529         }
530         return entryMsg;
531     }
532 
533     /**
534      * Logs entry to a method with location information.
535      *
536      * @param fqcn The fully qualified class name of the <b>caller</b>.
537      * @param format The format String for the parameters.
538      * @param params The parameters to the method.
539      */
540     protected EntryMessage enter(final String fqcn, final String format, final Object... params) {
541         EntryMessage entryMsg = null;
542         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
543             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg = entryMsg(format, params), null);
544         }
545         return entryMsg;
546     }
547 
548     /**
549      * Logs entry to a method with location information.
550      *
551      * @param fqcn The fully qualified class name of the <b>caller</b>.
552      * @param msgSupplier The Supplier of the Message.
553      */
554     @Deprecated
555     protected EntryMessage enter(final String fqcn, final MessageSupplier msgSupplier) {
556         EntryMessage message = null;
557         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
558             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, message = flowMessageFactory.newEntryMessage(
559                     msgSupplier.get()), null);
560         }
561         return message;
562     }
563 
564     /**
565      * Logs entry to a method with location information.
566      *
567      * @param fqcn
568      *            The fully qualified class name of the <b>caller</b>.
569      * @param message
570      *            the Message.
571      * @since 2.6
572      */
573     protected EntryMessage enter(final String fqcn, final Message message) {
574         EntryMessage flowMessage = null;
575         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
576             logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, flowMessage = flowMessageFactory.newEntryMessage(message),
577                     null);
578         }
579         return flowMessage;
580     }
581 
582     @Deprecated
583     @Override
584     public void entry() {
585         entry(FQCN, (Object[]) null);
586     }
587 
588     @Override
589     public void entry(final Object... params) {
590         entry(FQCN, params);
591     }
592 
593     /**
594      * Logs entry to a method with location information.
595      *
596      * @param fqcn The fully qualified class name of the <b>caller</b>.
597      * @param params The parameters to the method.
598      */
599     protected void entry(final String fqcn, final Object... params) {
600         if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
601             if (params == null) {
602                 logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg(null, (Supplier<?>[]) null), null);
603             } else {
604                 logMessageSafely(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg(null, params), null);
605             }
606         }
607     }
608 
609     protected EntryMessage entryMsg(final String format, final Object... params) {
610         final int count = params == null ? 0 : params.length;
611         if (count == 0) {
612             if (Strings.isEmpty(format)) {
613                 return flowMessageFactory.newEntryMessage(null);
614             }
615             return flowMessageFactory.newEntryMessage(new SimpleMessage(format));
616         }
617         if (format != null) {
618             return flowMessageFactory.newEntryMessage(new ParameterizedMessage(format, params));
619         }
620         final StringBuilder sb = new StringBuilder();
621         sb.append("params(");
622         for (int i = 0; i < count; i++) {
623             if (i > 0) {
624                 sb.append(", ");
625             }
626             final Object parm = params[i];
627             sb.append(parm instanceof Message ? ((Message) parm).getFormattedMessage() : String.valueOf(parm));
628         }
629         sb.append(')');
630         return flowMessageFactory.newEntryMessage(new SimpleMessage(sb));
631     }
632 
633     protected EntryMessage entryMsg(final String format, final MessageSupplier... paramSuppliers) {
634         final int count = paramSuppliers == null ? 0 : paramSuppliers.length;
635         final Object[] params = new Object[count];
636         for (int i = 0; i < count; i++) {
637             params[i] = paramSuppliers[i].get();
638             params[i] = params[i] != null ? ((Message) params[i]).getFormattedMessage() : null;
639         }
640         return entryMsg(format, params);
641     }
642 
643     protected EntryMessage entryMsg(final String format, final Supplier<?>... paramSuppliers) {
644         final int count = paramSuppliers == null ? 0 : paramSuppliers.length;
645         final Object[] params = new Object[count];
646         for (int i = 0; i < count; i++) {
647             params[i] = paramSuppliers[i].get();
648             if (params[i] instanceof Message) {
649                 params[i] = ((Message) params[i]).getFormattedMessage();
650             }
651         }
652         return entryMsg(format, params);
653     }
654 
655     @Override
656     public void error(final Marker marker, final Message msg) {
657         logIfEnabled(FQCN, Level.ERROR, marker, msg, msg != null ? msg.getThrowable() : null);
658     }
659 
660     @Override
661     public void error(final Marker marker, final Message msg, final Throwable t) {
662         logIfEnabled(FQCN, Level.ERROR, marker, msg, t);
663     }
664 
665     @Override
666     public void error(final Marker marker, final CharSequence message) {
667         logIfEnabled(FQCN, Level.ERROR, marker, message, null);
668     }
669 
670     @Override
671     public void error(final Marker marker, final CharSequence message, final Throwable t) {
672         logIfEnabled(FQCN, Level.ERROR, marker, message, t);
673     }
674 
675     @Override
676     public void error(final Marker marker, final Object message) {
677         logIfEnabled(FQCN, Level.ERROR, marker, message, null);
678     }
679 
680     @Override
681     public void error(final Marker marker, final Object message, final Throwable t) {
682         logIfEnabled(FQCN, Level.ERROR, marker, message, t);
683     }
684 
685     @Override
686     public void error(final Marker marker, final String message) {
687         logIfEnabled(FQCN, Level.ERROR, marker, message, (Throwable) null);
688     }
689 
690     @Override
691     public void error(final Marker marker, final String message, final Object... params) {
692         logIfEnabled(FQCN, Level.ERROR, marker, message, params);
693     }
694 
695     @Override
696     public void error(final Marker marker, final String message, final Throwable t) {
697         logIfEnabled(FQCN, Level.ERROR, marker, message, t);
698     }
699 
700     @Override
701     public void error(final Message msg) {
702         logIfEnabled(FQCN, Level.ERROR, null, msg, msg != null ? msg.getThrowable() : null);
703     }
704 
705     @Override
706     public void error(final Message msg, final Throwable t) {
707         logIfEnabled(FQCN, Level.ERROR, null, msg, t);
708     }
709 
710     @Override
711     public void error(final CharSequence message) {
712         logIfEnabled(FQCN, Level.ERROR, null, message, null);
713     }
714 
715     @Override
716     public void error(final CharSequence message, final Throwable t) {
717         logIfEnabled(FQCN, Level.ERROR, null, message, t);
718     }
719 
720     @Override
721     public void error(final Object message) {
722         logIfEnabled(FQCN, Level.ERROR, null, message, null);
723     }
724 
725     @Override
726     public void error(final Object message, final Throwable t) {
727         logIfEnabled(FQCN, Level.ERROR, null, message, t);
728     }
729 
730     @Override
731     public void error(final String message) {
732         logIfEnabled(FQCN, Level.ERROR, null, message, (Throwable) null);
733     }
734 
735     @Override
736     public void error(final String message, final Object... params) {
737         logIfEnabled(FQCN, Level.ERROR, null, message, params);
738     }
739 
740     @Override
741     public void error(final String message, final Throwable t) {
742         logIfEnabled(FQCN, Level.ERROR, null, message, t);
743     }
744 
745     @Override
746     public void error(final Supplier<?> msgSupplier) {
747         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, (Throwable) null);
748     }
749 
750     @Override
751     public void error(final Supplier<?> msgSupplier, final Throwable t) {
752         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t);
753     }
754 
755     @Override
756     public void error(final Marker marker, final Supplier<?> msgSupplier) {
757         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, (Throwable) null);
758     }
759 
760     @Override
761     public void error(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
762         logIfEnabled(FQCN, Level.ERROR, marker, message, paramSuppliers);
763     }
764 
765     @Override
766     public void error(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
767         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t);
768     }
769 
770     @Override
771     public void error(final String message, final Supplier<?>... paramSuppliers) {
772         logIfEnabled(FQCN, Level.ERROR, null, message, paramSuppliers);
773     }
774 
775     @Override
776     public void error(final Marker marker, final MessageSupplier msgSupplier) {
777         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, (Throwable) null);
778     }
779 
780     @Override
781     public void error(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
782         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t);
783     }
784 
785     @Override
786     public void error(final MessageSupplier msgSupplier) {
787         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, (Throwable) null);
788     }
789 
790     @Override
791     public void error(final MessageSupplier msgSupplier, final Throwable t) {
792         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t);
793     }
794 
795     @Override
796     public void error(final Marker marker, final String message, final Object p0) {
797         logIfEnabled(FQCN, Level.ERROR, marker, message, p0);
798     }
799 
800     @Override
801     public void error(final Marker marker, final String message, final Object p0, final Object p1) {
802         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1);
803     }
804 
805     @Override
806     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
807         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2);
808     }
809 
810     @Override
811     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
812             final Object p3) {
813         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3);
814     }
815 
816     @Override
817     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
818             final Object p3, final Object p4) {
819         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4);
820     }
821 
822     @Override
823     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
824             final Object p3, final Object p4, final Object p5) {
825         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5);
826     }
827 
828     @Override
829     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
830             final Object p3, final Object p4, final Object p5,
831             final Object p6) {
832         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6);
833     }
834 
835     @Override
836     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
837             final Object p3, final Object p4, final Object p5,
838             final Object p6, final Object p7) {
839         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
840     }
841 
842     @Override
843     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
844             final Object p3, final Object p4, final Object p5,
845             final Object p6, final Object p7, final Object p8) {
846         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
847     }
848 
849     @Override
850     public void error(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
851             final Object p3, final Object p4, final Object p5,
852             final Object p6, final Object p7, final Object p8, final Object p9) {
853         logIfEnabled(FQCN, Level.ERROR, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
854     }
855 
856     @Override
857     public void error(final String message, final Object p0) {
858         logIfEnabled(FQCN, Level.ERROR, null, message, p0);
859     }
860 
861     @Override
862     public void error(final String message, final Object p0, final Object p1) {
863         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1);
864     }
865 
866     @Override
867     public void error(final String message, final Object p0, final Object p1, final Object p2) {
868         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2);
869     }
870 
871     @Override
872     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
873         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3);
874     }
875 
876     @Override
877     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
878             final Object p4) {
879         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4);
880     }
881 
882     @Override
883     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
884             final Object p4, final Object p5) {
885         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5);
886     }
887 
888     @Override
889     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
890             final Object p4, final Object p5, final Object p6) {
891         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6);
892     }
893 
894     @Override
895     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
896             final Object p4, final Object p5, final Object p6, final Object p7) {
897         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
898     }
899 
900     @Override
901     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
902             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
903         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
904     }
905 
906     @Override
907     public void error(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
908             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
909         logIfEnabled(FQCN, Level.ERROR, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
910     }
911 
912     @Deprecated
913     @Override
914     public void exit() {
915         exit(FQCN, (Object) null);
916     }
917 
918     @Deprecated
919     @Override
920     public <R> R exit(final R result) {
921         return exit(FQCN, result);
922     }
923 
924     /**
925      * Logs exiting from a method with the result and location information.
926      *
927      * @param fqcn The fully qualified class name of the <b>caller</b>.
928      * @param <R> The type of the parameter and object being returned.
929      * @param result The result being returned from the method call.
930      * @return the return value passed to this method.
931      */
932     protected <R> R exit(final String fqcn, final R result) {
933         if (isEnabled(Level.TRACE, EXIT_MARKER, (CharSequence) null, null)) {
934             logMessageSafely(fqcn, Level.TRACE, EXIT_MARKER, exitMsg(null, result), null);
935         }
936         return result;
937     }
938 
939     /**
940      * Logs exiting from a method with the result and location information.
941      *
942      * @param fqcn The fully qualified class name of the <b>caller</b>.
943      * @param <R> The type of the parameter and object being returned.
944      * @param result The result being returned from the method call.
945      * @return the return value passed to this method.
946      */
947     protected <R> R exit(final String fqcn, final String format, final R result) {
948         if (isEnabled(Level.TRACE, EXIT_MARKER, (CharSequence) null, null)) {
949             logMessageSafely(fqcn, Level.TRACE, EXIT_MARKER, exitMsg(format, result), null);
950         }
951         return result;
952     }
953 
954     protected Message exitMsg(final String format, final Object result) {
955         if (result == null) {
956             if (format == null) {
957                 return messageFactory.newMessage("Exit");
958             }
959             return messageFactory.newMessage("Exit: " + format);
960         }
961         if (format == null) {
962             return messageFactory.newMessage("Exit with(" + result + ')');
963         }
964         return messageFactory.newMessage("Exit: " + format, result);
965 
966     }
967 
968     @Override
969     public void fatal(final Marker marker, final Message msg) {
970         logIfEnabled(FQCN, Level.FATAL, marker, msg, msg != null ? msg.getThrowable() : null);
971     }
972 
973     @Override
974     public void fatal(final Marker marker, final Message msg, final Throwable t) {
975         logIfEnabled(FQCN, Level.FATAL, marker, msg, t);
976     }
977 
978     @Override
979     public void fatal(final Marker marker, final CharSequence message) {
980         logIfEnabled(FQCN, Level.FATAL, marker, message, null);
981     }
982 
983     @Override
984     public void fatal(final Marker marker, final CharSequence message, final Throwable t) {
985         logIfEnabled(FQCN, Level.FATAL, marker, message, t);
986     }
987 
988     @Override
989     public void fatal(final Marker marker, final Object message) {
990         logIfEnabled(FQCN, Level.FATAL, marker, message, null);
991     }
992 
993     @Override
994     public void fatal(final Marker marker, final Object message, final Throwable t) {
995         logIfEnabled(FQCN, Level.FATAL, marker, message, t);
996     }
997 
998     @Override
999     public void fatal(final Marker marker, final String message) {
1000         logIfEnabled(FQCN, Level.FATAL, marker, message, (Throwable) null);
1001     }
1002 
1003     @Override
1004     public void fatal(final Marker marker, final String message, final Object... params) {
1005         logIfEnabled(FQCN, Level.FATAL, marker, message, params);
1006     }
1007 
1008     @Override
1009     public void fatal(final Marker marker, final String message, final Throwable t) {
1010         logIfEnabled(FQCN, Level.FATAL, marker, message, t);
1011     }
1012 
1013     @Override
1014     public void fatal(final Message msg) {
1015         logIfEnabled(FQCN, Level.FATAL, null, msg, msg != null ? msg.getThrowable() : null);
1016     }
1017 
1018     @Override
1019     public void fatal(final Message msg, final Throwable t) {
1020         logIfEnabled(FQCN, Level.FATAL, null, msg, t);
1021     }
1022 
1023     @Override
1024     public void fatal(final CharSequence message) {
1025         logIfEnabled(FQCN, Level.FATAL, null, message, null);
1026     }
1027 
1028     @Override
1029     public void fatal(final CharSequence message, final Throwable t) {
1030         logIfEnabled(FQCN, Level.FATAL, null, message, t);
1031     }
1032 
1033     @Override
1034     public void fatal(final Object message) {
1035         logIfEnabled(FQCN, Level.FATAL, null, message, null);
1036     }
1037 
1038     @Override
1039     public void fatal(final Object message, final Throwable t) {
1040         logIfEnabled(FQCN, Level.FATAL, null, message, t);
1041     }
1042 
1043     @Override
1044     public void fatal(final String message) {
1045         logIfEnabled(FQCN, Level.FATAL, null, message, (Throwable) null);
1046     }
1047 
1048     @Override
1049     public void fatal(final String message, final Object... params) {
1050         logIfEnabled(FQCN, Level.FATAL, null, message, params);
1051     }
1052 
1053     @Override
1054     public void fatal(final String message, final Throwable t) {
1055         logIfEnabled(FQCN, Level.FATAL, null, message, t);
1056     }
1057 
1058     @Override
1059     public void fatal(final Supplier<?> msgSupplier) {
1060         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, (Throwable) null);
1061     }
1062 
1063     @Override
1064     public void fatal(final Supplier<?> msgSupplier, final Throwable t) {
1065         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t);
1066     }
1067 
1068     @Override
1069     public void fatal(final Marker marker, final Supplier<?> msgSupplier) {
1070         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, (Throwable) null);
1071     }
1072 
1073     @Override
1074     public void fatal(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1075         logIfEnabled(FQCN, Level.FATAL, marker, message, paramSuppliers);
1076     }
1077 
1078     @Override
1079     public void fatal(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
1080         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t);
1081     }
1082 
1083     @Override
1084     public void fatal(final String message, final Supplier<?>... paramSuppliers) {
1085         logIfEnabled(FQCN, Level.FATAL, null, message, paramSuppliers);
1086     }
1087 
1088     @Override
1089     public void fatal(final Marker marker, final MessageSupplier msgSupplier) {
1090         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, (Throwable) null);
1091     }
1092 
1093     @Override
1094     public void fatal(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
1095         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t);
1096     }
1097 
1098     @Override
1099     public void fatal(final MessageSupplier msgSupplier) {
1100         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, (Throwable) null);
1101     }
1102 
1103     @Override
1104     public void fatal(final MessageSupplier msgSupplier, final Throwable t) {
1105         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t);
1106     }
1107 
1108     @Override
1109     public void fatal(final Marker marker, final String message, final Object p0) {
1110         logIfEnabled(FQCN, Level.FATAL, marker, message, p0);
1111     }
1112 
1113     @Override
1114     public void fatal(final Marker marker, final String message, final Object p0, final Object p1) {
1115         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1);
1116     }
1117 
1118     @Override
1119     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
1120         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2);
1121     }
1122 
1123     @Override
1124     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1125             final Object p3) {
1126         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3);
1127     }
1128 
1129     @Override
1130     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1131             final Object p3, final Object p4) {
1132         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4);
1133     }
1134 
1135     @Override
1136     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1137             final Object p3, final Object p4, final Object p5) {
1138         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5);
1139     }
1140 
1141     @Override
1142     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1143             final Object p3, final Object p4, final Object p5, final Object p6) {
1144         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6);
1145     }
1146 
1147     @Override
1148     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1149             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
1150         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1151     }
1152 
1153     @Override
1154     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1155             final Object p3, final Object p4, final Object p5,
1156             final Object p6, final Object p7, final Object p8) {
1157         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1158     }
1159 
1160     @Override
1161     public void fatal(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1162             final Object p3, final Object p4, final Object p5,
1163             final Object p6, final Object p7, final Object p8, final Object p9) {
1164         logIfEnabled(FQCN, Level.FATAL, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1165     }
1166 
1167     @Override
1168     public void fatal(final String message, final Object p0) {
1169         logIfEnabled(FQCN, Level.FATAL, null, message, p0);
1170     }
1171 
1172     @Override
1173     public void fatal(final String message, final Object p0, final Object p1) {
1174         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1);
1175     }
1176 
1177     @Override
1178     public void fatal(final String message, final Object p0, final Object p1, final Object p2) {
1179         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2);
1180     }
1181 
1182     @Override
1183     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1184         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3);
1185     }
1186 
1187     @Override
1188     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1189             final Object p4) {
1190         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4);
1191     }
1192 
1193     @Override
1194     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1195             final Object p4, final Object p5) {
1196         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5);
1197     }
1198 
1199     @Override
1200     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1201             final Object p4, final Object p5, final Object p6) {
1202         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6);
1203     }
1204 
1205     @Override
1206     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1207             final Object p4, final Object p5, final Object p6, final Object p7) {
1208         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1209     }
1210 
1211     @Override
1212     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1213             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
1214         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1215     }
1216 
1217     @Override
1218     public void fatal(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1219             final Object p4, final Object p5, final Object p6,
1220             final Object p7, final Object p8, final Object p9) {
1221         logIfEnabled(FQCN, Level.FATAL, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1222     }
1223 
1224     @SuppressWarnings("unchecked")
1225     @Override
1226     public <MF extends MessageFactory> MF getMessageFactory() {
1227         return (MF) messageFactory;
1228     }
1229 
1230     @Override
1231     public String getName() {
1232         return name;
1233     }
1234 
1235     @Override
1236     public void info(final Marker marker, final Message msg) {
1237         logIfEnabled(FQCN, Level.INFO, marker, msg, msg != null ? msg.getThrowable() : null);
1238     }
1239 
1240     @Override
1241     public void info(final Marker marker, final Message msg, final Throwable t) {
1242         logIfEnabled(FQCN, Level.INFO, marker, msg, t);
1243     }
1244 
1245     @Override
1246     public void info(final Marker marker, final CharSequence message) {
1247         logIfEnabled(FQCN, Level.INFO, marker, message, null);
1248     }
1249 
1250     @Override
1251     public void info(final Marker marker, final CharSequence message, final Throwable t) {
1252         logIfEnabled(FQCN, Level.INFO, marker, message, t);
1253     }
1254 
1255     @Override
1256     public void info(final Marker marker, final Object message) {
1257         logIfEnabled(FQCN, Level.INFO, marker, message, null);
1258     }
1259 
1260     @Override
1261     public void info(final Marker marker, final Object message, final Throwable t) {
1262         logIfEnabled(FQCN, Level.INFO, marker, message, t);
1263     }
1264 
1265     @Override
1266     public void info(final Marker marker, final String message) {
1267         logIfEnabled(FQCN, Level.INFO, marker, message, (Throwable) null);
1268     }
1269 
1270     @Override
1271     public void info(final Marker marker, final String message, final Object... params) {
1272         logIfEnabled(FQCN, Level.INFO, marker, message, params);
1273     }
1274 
1275     @Override
1276     public void info(final Marker marker, final String message, final Throwable t) {
1277         logIfEnabled(FQCN, Level.INFO, marker, message, t);
1278     }
1279 
1280     @Override
1281     public void info(final Message msg) {
1282         logIfEnabled(FQCN, Level.INFO, null, msg, msg != null ? msg.getThrowable() : null);
1283     }
1284 
1285     @Override
1286     public void info(final Message msg, final Throwable t) {
1287         logIfEnabled(FQCN, Level.INFO, null, msg, t);
1288     }
1289 
1290     @Override
1291     public void info(final CharSequence message) {
1292         logIfEnabled(FQCN, Level.INFO, null, message, null);
1293     }
1294 
1295     @Override
1296     public void info(final CharSequence message, final Throwable t) {
1297         logIfEnabled(FQCN, Level.INFO, null, message, t);
1298     }
1299 
1300     @Override
1301     public void info(final Object message) {
1302         logIfEnabled(FQCN, Level.INFO, null, message, null);
1303     }
1304 
1305     @Override
1306     public void info(final Object message, final Throwable t) {
1307         logIfEnabled(FQCN, Level.INFO, null, message, t);
1308     }
1309 
1310     @Override
1311     public void info(final String message) {
1312         logIfEnabled(FQCN, Level.INFO, null, message, (Throwable) null);
1313     }
1314 
1315     @Override
1316     public void info(final String message, final Object... params) {
1317         logIfEnabled(FQCN, Level.INFO, null, message, params);
1318     }
1319 
1320     @Override
1321     public void info(final String message, final Throwable t) {
1322         logIfEnabled(FQCN, Level.INFO, null, message, t);
1323     }
1324 
1325     @Override
1326     public void info(final Supplier<?> msgSupplier) {
1327         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, (Throwable) null);
1328     }
1329 
1330     @Override
1331     public void info(final Supplier<?> msgSupplier, final Throwable t) {
1332         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t);
1333     }
1334 
1335     @Override
1336     public void info(final Marker marker, final Supplier<?> msgSupplier) {
1337         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, (Throwable) null);
1338     }
1339 
1340     @Override
1341     public void info(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1342         logIfEnabled(FQCN, Level.INFO, marker, message, paramSuppliers);
1343     }
1344 
1345     @Override
1346     public void info(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
1347         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t);
1348     }
1349 
1350     @Override
1351     public void info(final String message, final Supplier<?>... paramSuppliers) {
1352         logIfEnabled(FQCN, Level.INFO, null, message, paramSuppliers);
1353     }
1354 
1355     @Override
1356     public void info(final Marker marker, final MessageSupplier msgSupplier) {
1357         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, (Throwable) null);
1358     }
1359 
1360     @Override
1361     public void info(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
1362         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t);
1363     }
1364 
1365     @Override
1366     public void info(final MessageSupplier msgSupplier) {
1367         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, (Throwable) null);
1368     }
1369 
1370     @Override
1371     public void info(final MessageSupplier msgSupplier, final Throwable t) {
1372         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t);
1373     }
1374 
1375     @Override
1376     public void info(final Marker marker, final String message, final Object p0) {
1377         logIfEnabled(FQCN, Level.INFO, marker, message, p0);
1378     }
1379 
1380     @Override
1381     public void info(final Marker marker, final String message, final Object p0, final Object p1) {
1382         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1);
1383     }
1384 
1385     @Override
1386     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
1387         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2);
1388     }
1389 
1390     @Override
1391     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1392             final Object p3) {
1393         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3);
1394     }
1395 
1396     @Override
1397     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1398             final Object p3, final Object p4) {
1399         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4);
1400     }
1401 
1402     @Override
1403     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1404             final Object p3, final Object p4, final Object p5) {
1405         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5);
1406     }
1407 
1408     @Override
1409     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1410             final Object p3, final Object p4, final Object p5, final Object p6) {
1411         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6);
1412     }
1413 
1414     @Override
1415     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1416             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
1417         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1418     }
1419 
1420     @Override
1421     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1422             final Object p3, final Object p4, final Object p5,
1423             final Object p6, final Object p7, final Object p8) {
1424         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1425     }
1426 
1427     @Override
1428     public void info(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
1429             final Object p3, final Object p4, final Object p5,
1430             final Object p6, final Object p7, final Object p8, final Object p9) {
1431         logIfEnabled(FQCN, Level.INFO, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1432     }
1433 
1434     @Override
1435     public void info(final String message, final Object p0) {
1436         logIfEnabled(FQCN, Level.INFO, null, message, p0);
1437     }
1438 
1439     @Override
1440     public void info(final String message, final Object p0, final Object p1) {
1441         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1);
1442     }
1443 
1444     @Override
1445     public void info(final String message, final Object p0, final Object p1, final Object p2) {
1446         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2);
1447     }
1448 
1449     @Override
1450     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1451         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3);
1452     }
1453 
1454     @Override
1455     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1456             final Object p4) {
1457         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4);
1458     }
1459 
1460     @Override
1461     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1462             final Object p4, final Object p5) {
1463         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5);
1464     }
1465 
1466     @Override
1467     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1468             final Object p4, final Object p5, final Object p6) {
1469         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6);
1470     }
1471 
1472     @Override
1473     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1474             final Object p4, final Object p5, final Object p6,
1475             final Object p7) {
1476         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1477     }
1478 
1479     @Override
1480     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1481             final Object p4, final Object p5, final Object p6,
1482             final Object p7, final Object p8) {
1483         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1484     }
1485 
1486     @Override
1487     public void info(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1488             final Object p4, final Object p5, final Object p6,
1489             final Object p7, final Object p8, final Object p9) {
1490         logIfEnabled(FQCN, Level.INFO, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1491     }
1492 
1493     @Override
1494     public boolean isDebugEnabled() {
1495         return isEnabled(Level.DEBUG, null, null);
1496     }
1497 
1498     @Override
1499     public boolean isDebugEnabled(final Marker marker) {
1500         return isEnabled(Level.DEBUG, marker, (Object) null, null);
1501     }
1502 
1503     @Override
1504     public boolean isEnabled(final Level level) {
1505         return isEnabled(level, null, (Object) null, null);
1506     }
1507 
1508     @Override
1509     public boolean isEnabled(final Level level, final Marker marker) {
1510         return isEnabled(level, marker, (Object) null, null);
1511     }
1512 
1513     @Override
1514     public boolean isErrorEnabled() {
1515         return isEnabled(Level.ERROR, null, (Object) null, null);
1516     }
1517 
1518     @Override
1519     public boolean isErrorEnabled(final Marker marker) {
1520         return isEnabled(Level.ERROR, marker, (Object) null, null);
1521     }
1522 
1523     @Override
1524     public boolean isFatalEnabled() {
1525         return isEnabled(Level.FATAL, null, (Object) null, null);
1526     }
1527 
1528     @Override
1529     public boolean isFatalEnabled(final Marker marker) {
1530         return isEnabled(Level.FATAL, marker, (Object) null, null);
1531     }
1532 
1533     @Override
1534     public boolean isInfoEnabled() {
1535         return isEnabled(Level.INFO, null, (Object) null, null);
1536     }
1537 
1538     @Override
1539     public boolean isInfoEnabled(final Marker marker) {
1540         return isEnabled(Level.INFO, marker, (Object) null, null);
1541     }
1542 
1543     @Override
1544     public boolean isTraceEnabled() {
1545         return isEnabled(Level.TRACE, null, (Object) null, null);
1546     }
1547 
1548     @Override
1549     public boolean isTraceEnabled(final Marker marker) {
1550         return isEnabled(Level.TRACE, marker, (Object) null, null);
1551     }
1552 
1553     @Override
1554     public boolean isWarnEnabled() {
1555         return isEnabled(Level.WARN, null, (Object) null, null);
1556     }
1557 
1558     @Override
1559     public boolean isWarnEnabled(final Marker marker) {
1560         return isEnabled(Level.WARN, marker, (Object) null, null);
1561     }
1562 
1563     @Override
1564     public void log(final Level level, final Marker marker, final Message msg) {
1565         logIfEnabled(FQCN, level, marker, msg, msg != null ? msg.getThrowable() : null);
1566     }
1567 
1568     @Override
1569     public void log(final Level level, final Marker marker, final Message msg, final Throwable t) {
1570         logIfEnabled(FQCN, level, marker, msg, t);
1571     }
1572 
1573     @Override
1574     public void log(final Level level, final Marker marker, final CharSequence message) {
1575         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1576     }
1577 
1578     @Override
1579     public void log(final Level level, final Marker marker, final CharSequence message, final Throwable t) {
1580         if (isEnabled(level, marker, message, t)) {
1581             logMessage(FQCN, level, marker, message, t);
1582         }
1583     }
1584 
1585     @Override
1586     public void log(final Level level, final Marker marker, final Object message) {
1587         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1588     }
1589 
1590     @Override
1591     public void log(final Level level, final Marker marker, final Object message, final Throwable t) {
1592         if (isEnabled(level, marker, message, t)) {
1593             logMessage(FQCN, level, marker, message, t);
1594         }
1595     }
1596 
1597     @Override
1598     public void log(final Level level, final Marker marker, final String message) {
1599         logIfEnabled(FQCN, level, marker, message, (Throwable) null);
1600     }
1601 
1602     @Override
1603     public void log(final Level level, final Marker marker, final String message, final Object... params) {
1604         logIfEnabled(FQCN, level, marker, message, params);
1605     }
1606 
1607     @Override
1608     public void log(final Level level, final Marker marker, final String message, final Throwable t) {
1609         logIfEnabled(FQCN, level, marker, message, t);
1610     }
1611 
1612     @Override
1613     public void log(final Level level, final Message msg) {
1614         logIfEnabled(FQCN, level, null, msg, msg != null ? msg.getThrowable() : null);
1615     }
1616 
1617     @Override
1618     public void log(final Level level, final Message msg, final Throwable t) {
1619         logIfEnabled(FQCN, level, null, msg, t);
1620     }
1621 
1622     @Override
1623     public void log(final Level level, final CharSequence message) {
1624         logIfEnabled(FQCN, level, null, message, null);
1625     }
1626 
1627     @Override
1628     public void log(final Level level, final CharSequence message, final Throwable t) {
1629         logIfEnabled(FQCN, level, null, message, t);
1630     }
1631 
1632     @Override
1633     public void log(final Level level, final Object message) {
1634         logIfEnabled(FQCN, level, null, message, null);
1635     }
1636 
1637     @Override
1638     public void log(final Level level, final Object message, final Throwable t) {
1639         logIfEnabled(FQCN, level, null, message, t);
1640     }
1641 
1642     @Override
1643     public void log(final Level level, final String message) {
1644         logIfEnabled(FQCN, level, null, message, (Throwable) null);
1645     }
1646 
1647     @Override
1648     public void log(final Level level, final String message, final Object... params) {
1649         logIfEnabled(FQCN, level, null, message, params);
1650     }
1651 
1652     @Override
1653     public void log(final Level level, final String message, final Throwable t) {
1654         logIfEnabled(FQCN, level, null, message, t);
1655     }
1656 
1657     @Override
1658     public void log(final Level level, final Supplier<?> msgSupplier) {
1659         logIfEnabled(FQCN, level, null, msgSupplier, (Throwable) null);
1660     }
1661 
1662     @Override
1663     public void log(final Level level, final Supplier<?> msgSupplier, final Throwable t) {
1664         logIfEnabled(FQCN, level, null, msgSupplier, t);
1665     }
1666 
1667     @Override
1668     public void log(final Level level, final Marker marker, final Supplier<?> msgSupplier) {
1669         logIfEnabled(FQCN, level, marker, msgSupplier, (Throwable) null);
1670     }
1671 
1672     @Override
1673     public void log(final Level level, final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
1674         logIfEnabled(FQCN, level, marker, message, paramSuppliers);
1675     }
1676 
1677     @Override
1678     public void log(final Level level, final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
1679         logIfEnabled(FQCN, level, marker, msgSupplier, t);
1680     }
1681 
1682     @Override
1683     public void log(final Level level, final String message, final Supplier<?>... paramSuppliers) {
1684         logIfEnabled(FQCN, level, null, message, paramSuppliers);
1685     }
1686 
1687     @Override
1688     public void log(final Level level, final Marker marker, final MessageSupplier msgSupplier) {
1689         logIfEnabled(FQCN, level, marker, msgSupplier, (Throwable) null);
1690     }
1691 
1692     @Override
1693     public void log(final Level level, final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
1694         logIfEnabled(FQCN, level, marker, msgSupplier, t);
1695     }
1696 
1697     @Override
1698     public void log(final Level level, final MessageSupplier msgSupplier) {
1699         logIfEnabled(FQCN, level, null, msgSupplier, (Throwable) null);
1700     }
1701 
1702     @Override
1703     public void log(final Level level, final MessageSupplier msgSupplier, final Throwable t) {
1704         logIfEnabled(FQCN, level, null, msgSupplier, t);
1705     }
1706 
1707     @Override
1708     public void log(final Level level, final Marker marker, final String message, final Object p0) {
1709         logIfEnabled(FQCN, level, marker, message, p0);
1710     }
1711 
1712     @Override
1713     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1) {
1714         logIfEnabled(FQCN, level, marker, message, p0, p1);
1715     }
1716 
1717     @Override
1718     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1719             final Object p2) {
1720         logIfEnabled(FQCN, level, marker, message, p0, p1, p2);
1721     }
1722 
1723     @Override
1724     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1725             final Object p2, final Object p3) {
1726         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3);
1727     }
1728 
1729     @Override
1730     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1731             final Object p2, final Object p3, final Object p4) {
1732         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4);
1733     }
1734 
1735     @Override
1736     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1737             final Object p2, final Object p3, final Object p4, final Object p5) {
1738         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5);
1739     }
1740 
1741     @Override
1742     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1743             final Object p2, final Object p3, final Object p4, final Object p5, final Object p6) {
1744         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6);
1745     }
1746 
1747     @Override
1748     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1749             final Object p2, final Object p3, final Object p4, final Object p5,
1750             final Object p6, final Object p7) {
1751         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1752     }
1753 
1754     @Override
1755     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1756             final Object p2, final Object p3, final Object p4, final Object p5,
1757             final Object p6, final Object p7, final Object p8) {
1758         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1759     }
1760 
1761     @Override
1762     public void log(final Level level, final Marker marker, final String message, final Object p0, final Object p1,
1763             final Object p2, final Object p3, final Object p4, final Object p5,
1764             final Object p6, final Object p7, final Object p8, final Object p9) {
1765         logIfEnabled(FQCN, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1766     }
1767 
1768     @Override
1769     public void log(final Level level, final String message, final Object p0) {
1770         logIfEnabled(FQCN, level, null, message, p0);
1771     }
1772 
1773     @Override
1774     public void log(final Level level, final String message, final Object p0, final Object p1) {
1775         logIfEnabled(FQCN, level, null, message, p0, p1);
1776     }
1777 
1778     @Override
1779     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2) {
1780         logIfEnabled(FQCN, level, null, message, p0, p1, p2);
1781     }
1782 
1783     @Override
1784     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
1785         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3);
1786     }
1787 
1788     @Override
1789     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1790             final Object p4) {
1791         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4);
1792     }
1793 
1794     @Override
1795     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1796             final Object p4, final Object p5) {
1797         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5);
1798     }
1799 
1800     @Override
1801     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1802             final Object p4, final Object p5, final Object p6) {
1803         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6);
1804     }
1805 
1806     @Override
1807     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1808             final Object p4, final Object p5, final Object p6, final Object p7) {
1809         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
1810     }
1811 
1812     @Override
1813     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1814             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
1815         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1816     }
1817 
1818     @Override
1819     public void log(final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3,
1820             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
1821         logIfEnabled(FQCN, level, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1822     }
1823 
1824     @Override
1825     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Message msg,
1826             final Throwable t) {
1827         if (isEnabled(level, marker, msg, t)) {
1828             logMessageSafely(fqcn, level, marker, msg, t);
1829         }
1830     }
1831 
1832     @Override
1833     public void logIfEnabled(final String fqcn, final Level level, final Marker marker,
1834             final MessageSupplier msgSupplier, final Throwable t) {
1835         if (isEnabled(level, marker, msgSupplier, t)) {
1836             logMessage(fqcn, level, marker, msgSupplier, t);
1837         }
1838     }
1839 
1840     @Override
1841     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Object message,
1842             final Throwable t) {
1843         if (isEnabled(level, marker, message, t)) {
1844             logMessage(fqcn, level, marker, message, t);
1845         }
1846     }
1847 
1848     @Override
1849     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final CharSequence message,
1850             final Throwable t) {
1851         if (isEnabled(level, marker, message, t)) {
1852             logMessage(fqcn, level, marker, message, t);
1853         }
1854     }
1855 
1856     @Override
1857     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Supplier<?> msgSupplier,
1858             final Throwable t) {
1859         if (isEnabled(level, marker, msgSupplier, t)) {
1860             logMessage(fqcn, level, marker, msgSupplier, t);
1861         }
1862     }
1863 
1864     @Override
1865     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message) {
1866         if (isEnabled(level, marker, message)) {
1867             logMessage(fqcn, level, marker, message);
1868         }
1869     }
1870 
1871     @Override
1872     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1873             final Supplier<?>... paramSuppliers) {
1874         if (isEnabled(level, marker, message)) {
1875             logMessage(fqcn, level, marker, message, paramSuppliers);
1876         }
1877     }
1878 
1879     @Override
1880     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1881             final Object... params) {
1882         if (isEnabled(level, marker, message, params)) {
1883             logMessage(fqcn, level, marker, message, params);
1884         }
1885     }
1886 
1887     @Override
1888     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1889             final Object p0) {
1890         if (isEnabled(level, marker, message, p0)) {
1891             logMessage(fqcn, level, marker, message, p0);
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, final Object p1) {
1898         if (isEnabled(level, marker, message, p0, p1)) {
1899             logMessage(fqcn, level, marker, message, p0, p1);
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, final Object p2) {
1906         if (isEnabled(level, marker, message, p0, p1, p2)) {
1907             logMessage(fqcn, level, marker, message, p0, p1, p2);
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, final Object p3) {
1914         if (isEnabled(level, marker, message, p0, p1, p2, p3)) {
1915             logMessage(fqcn, level, marker, message, p0, p1, p2, p3);
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, final Object p4) {
1922         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4)) {
1923             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4);
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, final Object p5) {
1930         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5)) {
1931             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5);
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             final Object p6) {
1939         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6)) {
1940             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6);
1941         }
1942     }
1943 
1944     @Override
1945     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1946             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1947             final Object p6, final Object p7) {
1948         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7)) {
1949             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
1950         }
1951     }
1952 
1953     @Override
1954     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1955             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1956             final Object p6, final Object p7, final Object p8) {
1957         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
1958             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1959         }
1960     }
1961 
1962     @Override
1963     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1964             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
1965             final Object p6, final Object p7, final Object p8, final Object p9) {
1966         if (isEnabled(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
1967             logMessage(fqcn, level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1968         }
1969     }
1970 
1971     @Override
1972     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
1973             final Throwable t) {
1974         if (isEnabled(level, marker, message, t)) {
1975             logMessage(fqcn, level, marker, message, t);
1976         }
1977     }
1978 
1979     protected void logMessage(final String fqcn, final Level level, final Marker marker, final CharSequence message,
1980             final Throwable t) {
1981         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), t);
1982     }
1983 
1984     protected void logMessage(final String fqcn, final Level level, final Marker marker, final Object message,
1985             final Throwable t) {
1986         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), t);
1987     }
1988 
1989     protected void logMessage(final String fqcn, final Level level, final Marker marker,
1990             final MessageSupplier msgSupplier, final Throwable t) {
1991         final Message message = LambdaUtil.get(msgSupplier);
1992         logMessageSafely(fqcn, level, marker, message, (t == null && message != null) ? message.getThrowable() : t);
1993     }
1994 
1995     protected void logMessage(final String fqcn, final Level level, final Marker marker, final Supplier<?> msgSupplier,
1996             final Throwable t) {
1997         final Message message = LambdaUtil.getMessage(msgSupplier, messageFactory);
1998         logMessageSafely(fqcn, level, marker, message, (t == null && message != null) ? message.getThrowable() : t);
1999     }
2000 
2001     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2002             final Throwable t) {
2003         logMessageSafely(fqcn, level, marker, messageFactory.newMessage(message), t);
2004     }
2005 
2006     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message) {
2007         final Message msg = messageFactory.newMessage(message);
2008         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2009     }
2010 
2011     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2012             final Object... params) {
2013         final Message msg = messageFactory.newMessage(message, params);
2014         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2015     }
2016 
2017     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2018             final Object p0) {
2019         final Message msg = messageFactory.newMessage(message, p0);
2020         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2021     }
2022 
2023     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2024             final Object p0, final Object p1) {
2025         final Message msg = messageFactory.newMessage(message, p0, p1);
2026         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2027     }
2028 
2029     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2030             final Object p0, final Object p1, final Object p2) {
2031         final Message msg = messageFactory.newMessage(message, p0, p1, p2);
2032         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2033     }
2034 
2035     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2036             final Object p0, final Object p1, final Object p2, final Object p3) {
2037         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3);
2038         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2039     }
2040 
2041     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2042             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4) {
2043         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4);
2044         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2045     }
2046 
2047     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2048             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5) {
2049         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5);
2050         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2051     }
2052 
2053     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2054             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2055             final Object p6) {
2056         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6);
2057         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2058     }
2059 
2060     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
2061             final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5,
2062             final Object p6, final Object p7) {
2063         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7);
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, final Object p7, final Object p8) {
2070         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
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, final Object p8, final Object p9) {
2077         final Message msg = messageFactory.newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
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 Supplier<?>... paramSuppliers) {
2083         final Message msg = messageFactory.newMessage(message, LambdaUtil.getAll(paramSuppliers));
2084         logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
2085     }
2086 
2087     public void logMessage(final Level level, final Marker marker, final String fqcn, final StackTraceElement location,
2088         final Message message, final Throwable throwable) {
2089         try {
2090             incrementRecursionDepth();
2091             log(level, marker, fqcn, location, message, throwable);
2092         } catch (Throwable t) {
2093             handleLogMessageException(t, fqcn, message);
2094         } finally {
2095             decrementRecursionDepth();
2096             ReusableMessageFactory.release(message);
2097         }
2098     }
2099 
2100     protected void log(final Level level, final Marker marker, final String fqcn, final StackTraceElement location,
2101         final Message message, final Throwable throwable) {
2102         logMessage(fqcn, level, marker, message, throwable);
2103     }
2104 
2105     @Override
2106     public void printf(final Level level, final Marker marker, final String format, final Object... params) {
2107         if (isEnabled(level, marker, format, params)) {
2108             final Message msg = new StringFormattedMessage(format, params);
2109             logMessageSafely(FQCN, level, marker, msg, msg.getThrowable());
2110         }
2111     }
2112 
2113     @Override
2114     public void printf(final Level level, final String format, final Object... params) {
2115         if (isEnabled(level, null, format, params)) {
2116             final Message msg = new StringFormattedMessage(format, params);
2117             logMessageSafely(FQCN, level, null, msg, msg.getThrowable());
2118         }
2119     }
2120 
2121     @PerformanceSensitive
2122     // NOTE: This is a hot method. Current implementation compiles to 30 bytes of byte code.
2123     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2124     private void logMessageSafely(final String fqcn, final Level level, final Marker marker, final Message msg,
2125             final Throwable throwable) {
2126         try {
2127             logMessageTrackRecursion(fqcn, level, marker, msg, throwable);
2128         } finally {
2129             // LOG4J2-1583 prevent scrambled logs when logging calls are nested (logging in toString())
2130             ReusableMessageFactory.release(msg);
2131         }
2132     }
2133 
2134     @PerformanceSensitive
2135     // NOTE: This is a hot method. Current implementation compiles to 33 bytes of byte code.
2136     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2137     private void logMessageTrackRecursion(final String fqcn,
2138                                           final Level level,
2139                                           final Marker marker,
2140                                           final Message msg,
2141                                           final Throwable throwable) {
2142         try {
2143             incrementRecursionDepth(); // LOG4J2-1518, LOG4J2-2031
2144             tryLogMessage(fqcn, getLocation(fqcn), level, marker, msg, throwable);
2145         } finally {
2146             decrementRecursionDepth();
2147         }
2148     }
2149 
2150     private static int[] getRecursionDepthHolder() {
2151         int[] result = recursionDepthHolder.get();
2152         if (result == null) {
2153             result = new int[1];
2154             recursionDepthHolder.set(result);
2155         }
2156         return result;
2157     }
2158 
2159     private static void incrementRecursionDepth() {
2160         getRecursionDepthHolder()[0]++;
2161     }
2162     private static void decrementRecursionDepth() {
2163         final int[] depth = getRecursionDepthHolder();
2164         depth[0]--;
2165         if (depth[0] < 0) {
2166             throw new IllegalStateException("Recursion depth became negative: " + depth[0]);
2167         }
2168     }
2169 
2170     /**
2171      * Returns the depth of nested logging calls in the current Thread: zero if no logging call has been made,
2172      * one if a single logging call without nested logging calls has been made, or more depending on the level of
2173      * nesting.
2174      * @return the depth of the nested logging calls in the current Thread
2175      */
2176     public static int getRecursionDepth() {
2177         return getRecursionDepthHolder()[0];
2178     }
2179 
2180     @PerformanceSensitive
2181     // NOTE: This is a hot method. Current implementation compiles to 26 bytes of byte code.
2182     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2183     private void tryLogMessage(final String fqcn,
2184                                final StackTraceElement location,
2185                                final Level level,
2186                                final Marker marker,
2187                                final Message msg,
2188                                final Throwable throwable) {
2189         try {
2190             log(level, marker, fqcn, location, msg, throwable);
2191         } catch (final Throwable t) {
2192             // LOG4J2-1990 Log4j2 suppresses all exceptions that occur once application called the logger
2193             handleLogMessageException(t, fqcn, msg);
2194         }
2195     }
2196 
2197     @PerformanceSensitive
2198     // NOTE: This is a hot method. Current implementation compiles to 15 bytes of byte code.
2199     // This is within the 35 byte MaxInlineSize threshold. Modify with care!
2200     private StackTraceElement getLocation(String fqcn) {
2201         return requiresLocation() ? StackLocatorUtil.calcLocation(fqcn) : null;
2202     }
2203 
2204     // LOG4J2-1990 Log4j2 suppresses all exceptions that occur once application called the logger
2205     // TODO Configuration setting to propagate exceptions back to the caller *if requested*
2206     private void handleLogMessageException(final Throwable exception, final String fqcn, final Message msg) {
2207         if (exception instanceof LoggingException) {
2208             throw (LoggingException) exception;
2209         }
2210         final String format = msg.getFormat();
2211         final int formatLength = format == null ? 4 : format.length();
2212         final StringBuilder sb = new StringBuilder(formatLength + 100);
2213         sb.append(fqcn);
2214         sb.append(" caught ");
2215         sb.append(exception.getClass().getName());
2216         sb.append(" logging ");
2217         sb.append(msg.getClass().getSimpleName());
2218         sb.append(": ");
2219         sb.append(format);
2220         StatusLogger.getLogger().warn(sb.toString(), exception);
2221     }
2222 
2223     @Override
2224     public <T extends Throwable> T throwing(final T t) {
2225         return throwing(FQCN, Level.ERROR, t);
2226     }
2227 
2228     @Override
2229     public <T extends Throwable> T throwing(final Level level, final T t) {
2230         return throwing(FQCN, level, t);
2231     }
2232 
2233     /**
2234      * Logs a Throwable to be thrown.
2235      *
2236      * @param <T> the type of the Throwable.
2237      * @param fqcn the fully qualified class name of this Logger implementation.
2238      * @param level The logging Level.
2239      * @param t The Throwable.
2240      * @return the Throwable.
2241      */
2242     protected <T extends Throwable> T throwing(final String fqcn, final Level level, final T t) {
2243         if (isEnabled(level, THROWING_MARKER, (Object) null, null)) {
2244             logMessageSafely(fqcn, level, THROWING_MARKER, throwingMsg(t), t);
2245         }
2246         return t;
2247     }
2248 
2249     protected Message throwingMsg(final Throwable t) {
2250         return messageFactory.newMessage(THROWING);
2251     }
2252 
2253     @Override
2254     public void trace(final Marker marker, final Message msg) {
2255         logIfEnabled(FQCN, Level.TRACE, marker, msg, msg != null ? msg.getThrowable() : null);
2256     }
2257 
2258     @Override
2259     public void trace(final Marker marker, final Message msg, final Throwable t) {
2260         logIfEnabled(FQCN, Level.TRACE, marker, msg, t);
2261     }
2262 
2263     @Override
2264     public void trace(final Marker marker, final CharSequence message) {
2265         logIfEnabled(FQCN, Level.TRACE, marker, message, null);
2266     }
2267 
2268     @Override
2269     public void trace(final Marker marker, final CharSequence message, final Throwable t) {
2270         logIfEnabled(FQCN, Level.TRACE, marker, message, t);
2271     }
2272 
2273     @Override
2274     public void trace(final Marker marker, final Object message) {
2275         logIfEnabled(FQCN, Level.TRACE, marker, message, null);
2276     }
2277 
2278     @Override
2279     public void trace(final Marker marker, final Object message, final Throwable t) {
2280         logIfEnabled(FQCN, Level.TRACE, marker, message, t);
2281     }
2282 
2283     @Override
2284     public void trace(final Marker marker, final String message) {
2285         logIfEnabled(FQCN, Level.TRACE, marker, message, (Throwable) null);
2286     }
2287 
2288     @Override
2289     public void trace(final Marker marker, final String message, final Object... params) {
2290         logIfEnabled(FQCN, Level.TRACE, marker, message, params);
2291     }
2292 
2293     @Override
2294     public void trace(final Marker marker, final String message, final Throwable t) {
2295         logIfEnabled(FQCN, Level.TRACE, marker, message, t);
2296     }
2297 
2298     @Override
2299     public void trace(final Message msg) {
2300         logIfEnabled(FQCN, Level.TRACE, null, msg, msg != null ? msg.getThrowable() : null);
2301     }
2302 
2303     @Override
2304     public void trace(final Message msg, final Throwable t) {
2305         logIfEnabled(FQCN, Level.TRACE, null, msg, t);
2306     }
2307 
2308     @Override
2309     public void trace(final CharSequence message) {
2310         logIfEnabled(FQCN, Level.TRACE, null, message, null);
2311     }
2312 
2313     @Override
2314     public void trace(final CharSequence message, final Throwable t) {
2315         logIfEnabled(FQCN, Level.TRACE, null, message, t);
2316     }
2317 
2318     @Override
2319     public void trace(final Object message) {
2320         logIfEnabled(FQCN, Level.TRACE, null, message, null);
2321     }
2322 
2323     @Override
2324     public void trace(final Object message, final Throwable t) {
2325         logIfEnabled(FQCN, Level.TRACE, null, message, t);
2326     }
2327 
2328     @Override
2329     public void trace(final String message) {
2330         logIfEnabled(FQCN, Level.TRACE, null, message, (Throwable) null);
2331     }
2332 
2333     @Override
2334     public void trace(final String message, final Object... params) {
2335         logIfEnabled(FQCN, Level.TRACE, null, message, params);
2336     }
2337 
2338     @Override
2339     public void trace(final String message, final Throwable t) {
2340         logIfEnabled(FQCN, Level.TRACE, null, message, t);
2341     }
2342 
2343     @Override
2344     public void trace(final Supplier<?> msgSupplier) {
2345         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, (Throwable) null);
2346     }
2347 
2348     @Override
2349     public void trace(final Supplier<?> msgSupplier, final Throwable t) {
2350         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t);
2351     }
2352 
2353     @Override
2354     public void trace(final Marker marker, final Supplier<?> msgSupplier) {
2355         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, (Throwable) null);
2356     }
2357 
2358     @Override
2359     public void trace(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
2360         logIfEnabled(FQCN, Level.TRACE, marker, message, paramSuppliers);
2361     }
2362 
2363     @Override
2364     public void trace(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
2365         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t);
2366     }
2367 
2368     @Override
2369     public void trace(final String message, final Supplier<?>... paramSuppliers) {
2370         logIfEnabled(FQCN, Level.TRACE, null, message, paramSuppliers);
2371     }
2372 
2373     @Override
2374     public void trace(final Marker marker, final MessageSupplier msgSupplier) {
2375         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, (Throwable) null);
2376     }
2377 
2378     @Override
2379     public void trace(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
2380         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t);
2381     }
2382 
2383     @Override
2384     public void trace(final MessageSupplier msgSupplier) {
2385         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, (Throwable) null);
2386     }
2387 
2388     @Override
2389     public void trace(final MessageSupplier msgSupplier, final Throwable t) {
2390         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t);
2391     }
2392 
2393     @Override
2394     public void trace(final Marker marker, final String message, final Object p0) {
2395         logIfEnabled(FQCN, Level.TRACE, marker, message, p0);
2396     }
2397 
2398     @Override
2399     public void trace(final Marker marker, final String message, final Object p0, final Object p1) {
2400         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1);
2401     }
2402 
2403     @Override
2404     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
2405         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2);
2406     }
2407 
2408     @Override
2409     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2410             final Object p3) {
2411         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3);
2412     }
2413 
2414     @Override
2415     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2416             final Object p3, final Object p4) {
2417         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4);
2418     }
2419 
2420     @Override
2421     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2422             final Object p3, final Object p4, final Object p5) {
2423         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5);
2424     }
2425 
2426     @Override
2427     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2428             final Object p3, final Object p4, final Object p5, final Object p6) {
2429         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6);
2430     }
2431 
2432     @Override
2433     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2434             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
2435         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
2436     }
2437 
2438     @Override
2439     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2440             final Object p3, final Object p4, final Object p5,
2441             final Object p6, final Object p7, final Object p8) {
2442         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2443     }
2444 
2445     @Override
2446     public void trace(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2447             final Object p3, final Object p4, final Object p5,
2448             final Object p6, final Object p7, final Object p8, final Object p9) {
2449         logIfEnabled(FQCN, Level.TRACE, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2450     }
2451 
2452     @Override
2453     public void trace(final String message, final Object p0) {
2454         logIfEnabled(FQCN, Level.TRACE, null, message, p0);
2455     }
2456 
2457     @Override
2458     public void trace(final String message, final Object p0, final Object p1) {
2459         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1);
2460     }
2461 
2462     @Override
2463     public void trace(final String message, final Object p0, final Object p1, final Object p2) {
2464         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2);
2465     }
2466 
2467     @Override
2468     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
2469         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3);
2470     }
2471 
2472     @Override
2473     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2474             final Object p4) {
2475         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4);
2476     }
2477 
2478     @Override
2479     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2480             final Object p4, final Object p5) {
2481         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5);
2482     }
2483 
2484     @Override
2485     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2486             final Object p4, final Object p5, final Object p6) {
2487         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6);
2488     }
2489 
2490     @Override
2491     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2492             final Object p4, final Object p5, final Object p6, final Object p7) {
2493         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
2494     }
2495 
2496     @Override
2497     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2498             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2499         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2500     }
2501 
2502     @Override
2503     public void trace(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2504             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) {
2505         logIfEnabled(FQCN, Level.TRACE, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2506     }
2507 
2508     @Override
2509     public EntryMessage traceEntry() {
2510         return enter(FQCN, null, (Object[]) null);
2511     }
2512 
2513     @Override
2514     public EntryMessage traceEntry(final String format, final Object... params) {
2515         return enter(FQCN, format, params);
2516     }
2517 
2518     @Override
2519     public EntryMessage traceEntry(final Supplier<?>... paramSuppliers) {
2520         return enter(FQCN, null, paramSuppliers);
2521     }
2522 
2523     @Override
2524     public EntryMessage traceEntry(final String format, final Supplier<?>... paramSuppliers) {
2525         return enter(FQCN, format, paramSuppliers);
2526     }
2527 
2528     @Override
2529     public EntryMessage traceEntry(final Message message) {
2530         return enter(FQCN, message);
2531     }
2532 
2533     @Override
2534     public void traceExit() {
2535         exit(FQCN, null, null);
2536     }
2537 
2538     @Override
2539     public <R> R traceExit(final R result) {
2540         return exit(FQCN, null, result);
2541     }
2542 
2543     @Override
2544     public <R> R traceExit(final String format, final R result) {
2545         return exit(FQCN, format, result);
2546     }
2547 
2548     @Override
2549     public void traceExit(final EntryMessage message) {
2550         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2551         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2552             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(message), null);
2553         }
2554     }
2555 
2556     @Override
2557     public <R> R traceExit(final EntryMessage message, final R result) {
2558         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2559         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2560             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(result, message), null);
2561         }
2562         return result;
2563     }
2564 
2565     @Override
2566     public <R> R traceExit(final Message message, final R result) {
2567         // If the message is null, traceEnter returned null because flow logging was disabled, we can optimize out calling isEnabled().
2568         if (message != null && isEnabled(Level.TRACE, EXIT_MARKER, message, null)) {
2569             logMessageSafely(FQCN, Level.TRACE, EXIT_MARKER, flowMessageFactory.newExitMessage(result, message), null);
2570         }
2571         return result;
2572     }
2573 
2574     @Override
2575     public void warn(final Marker marker, final Message msg) {
2576         logIfEnabled(FQCN, Level.WARN, marker, msg, msg != null ? msg.getThrowable() : null);
2577     }
2578 
2579     @Override
2580     public void warn(final Marker marker, final Message msg, final Throwable t) {
2581         logIfEnabled(FQCN, Level.WARN, marker, msg, t);
2582     }
2583 
2584     @Override
2585     public void warn(final Marker marker, final CharSequence message) {
2586         logIfEnabled(FQCN, Level.WARN, marker, message, null);
2587     }
2588 
2589     @Override
2590     public void warn(final Marker marker, final CharSequence message, final Throwable t) {
2591         logIfEnabled(FQCN, Level.WARN, marker, message, t);
2592     }
2593 
2594     @Override
2595     public void warn(final Marker marker, final Object message) {
2596         logIfEnabled(FQCN, Level.WARN, marker, message, null);
2597     }
2598 
2599     @Override
2600     public void warn(final Marker marker, final Object message, final Throwable t) {
2601         logIfEnabled(FQCN, Level.WARN, marker, message, t);
2602     }
2603 
2604     @Override
2605     public void warn(final Marker marker, final String message) {
2606         logIfEnabled(FQCN, Level.WARN, marker, message, (Throwable) null);
2607     }
2608 
2609     @Override
2610     public void warn(final Marker marker, final String message, final Object... params) {
2611         logIfEnabled(FQCN, Level.WARN, marker, message, params);
2612     }
2613 
2614     @Override
2615     public void warn(final Marker marker, final String message, final Throwable t) {
2616         logIfEnabled(FQCN, Level.WARN, marker, message, t);
2617     }
2618 
2619     @Override
2620     public void warn(final Message msg) {
2621         logIfEnabled(FQCN, Level.WARN, null, msg, msg != null ? msg.getThrowable() : null);
2622     }
2623 
2624     @Override
2625     public void warn(final Message msg, final Throwable t) {
2626         logIfEnabled(FQCN, Level.WARN, null, msg, t);
2627     }
2628 
2629     @Override
2630     public void warn(final CharSequence message) {
2631         logIfEnabled(FQCN, Level.WARN, null, message, null);
2632     }
2633 
2634     @Override
2635     public void warn(final CharSequence message, final Throwable t) {
2636         logIfEnabled(FQCN, Level.WARN, null, message, t);
2637     }
2638 
2639     @Override
2640     public void warn(final Object message) {
2641         logIfEnabled(FQCN, Level.WARN, null, message, null);
2642     }
2643 
2644     @Override
2645     public void warn(final Object message, final Throwable t) {
2646         logIfEnabled(FQCN, Level.WARN, null, message, t);
2647     }
2648 
2649     @Override
2650     public void warn(final String message) {
2651         logIfEnabled(FQCN, Level.WARN, null, message, (Throwable) null);
2652     }
2653 
2654     @Override
2655     public void warn(final String message, final Object... params) {
2656         logIfEnabled(FQCN, Level.WARN, null, message, params);
2657     }
2658 
2659     @Override
2660     public void warn(final String message, final Throwable t) {
2661         logIfEnabled(FQCN, Level.WARN, null, message, t);
2662     }
2663 
2664     @Override
2665     public void warn(final Supplier<?> msgSupplier) {
2666         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, (Throwable) null);
2667     }
2668 
2669     @Override
2670     public void warn(final Supplier<?> msgSupplier, final Throwable t) {
2671         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t);
2672     }
2673 
2674     @Override
2675     public void warn(final Marker marker, final Supplier<?> msgSupplier) {
2676         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, (Throwable) null);
2677     }
2678 
2679     @Override
2680     public void warn(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
2681         logIfEnabled(FQCN, Level.WARN, marker, message, paramSuppliers);
2682     }
2683 
2684     @Override
2685     public void warn(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
2686         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t);
2687     }
2688 
2689     @Override
2690     public void warn(final String message, final Supplier<?>... paramSuppliers) {
2691         logIfEnabled(FQCN, Level.WARN, null, message, paramSuppliers);
2692     }
2693 
2694     @Override
2695     public void warn(final Marker marker, final MessageSupplier msgSupplier) {
2696         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, (Throwable) null);
2697     }
2698 
2699     @Override
2700     public void warn(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
2701         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t);
2702     }
2703 
2704     @Override
2705     public void warn(final MessageSupplier msgSupplier) {
2706         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, (Throwable) null);
2707     }
2708 
2709     @Override
2710     public void warn(final MessageSupplier msgSupplier, final Throwable t) {
2711         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t);
2712     }
2713 
2714     @Override
2715     public void warn(final Marker marker, final String message, final Object p0) {
2716         logIfEnabled(FQCN, Level.WARN, marker, message, p0);
2717     }
2718 
2719     @Override
2720     public void warn(final Marker marker, final String message, final Object p0, final Object p1) {
2721         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1);
2722     }
2723 
2724     @Override
2725     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2) {
2726         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2);
2727     }
2728 
2729     @Override
2730     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2731             final Object p3) {
2732         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3);
2733     }
2734 
2735     @Override
2736     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2737             final Object p3, final Object p4) {
2738         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4);
2739     }
2740 
2741     @Override
2742     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2743             final Object p3, final Object p4, final Object p5) {
2744         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5);
2745     }
2746 
2747     @Override
2748     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2749             final Object p3, final Object p4, final Object p5, final Object p6) {
2750         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6);
2751     }
2752 
2753     @Override
2754     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2755             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) {
2756         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
2757     }
2758 
2759     @Override
2760     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2761             final Object p3, final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2762         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2763     }
2764 
2765     @Override
2766     public void warn(final Marker marker, final String message, final Object p0, final Object p1, final Object p2,
2767             final Object p3, final Object p4, final Object p5,
2768             final Object p6, final Object p7, final Object p8, final Object p9) {
2769         logIfEnabled(FQCN, Level.WARN, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2770     }
2771 
2772     @Override
2773     public void warn(final String message, final Object p0) {
2774         logIfEnabled(FQCN, Level.WARN, null, message, p0);
2775     }
2776 
2777     @Override
2778     public void warn(final String message, final Object p0, final Object p1) {
2779         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1);
2780     }
2781 
2782     @Override
2783     public void warn(final String message, final Object p0, final Object p1, final Object p2) {
2784         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2);
2785     }
2786 
2787     @Override
2788     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3) {
2789         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3);
2790     }
2791 
2792     @Override
2793     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2794             final Object p4) {
2795         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4);
2796     }
2797 
2798     @Override
2799     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2800             final Object p4, final Object p5) {
2801         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5);
2802     }
2803 
2804     @Override
2805     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2806             final Object p4, final Object p5, final Object p6) {
2807         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6);
2808     }
2809 
2810     @Override
2811     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2812             final Object p4, final Object p5, final Object p6, final Object p7) {
2813         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7);
2814     }
2815 
2816     @Override
2817     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2818             final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) {
2819         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
2820     }
2821 
2822     @Override
2823     public void warn(final String message, final Object p0, final Object p1, final Object p2, final Object p3,
2824             final Object p4, final Object p5, final Object p6,
2825             final Object p7, final Object p8, final Object p9) {
2826         logIfEnabled(FQCN, Level.WARN, null, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2827     }
2828 
2829     protected boolean requiresLocation() {
2830         return false;
2831     }
2832 }