001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017package org.apache.logging.log4j.spi;
018
019import java.io.Serializable;
020
021import org.apache.logging.log4j.Level;
022import org.apache.logging.log4j.LoggingException;
023import org.apache.logging.log4j.Marker;
024import org.apache.logging.log4j.MarkerManager;
025import org.apache.logging.log4j.message.DefaultFlowMessageFactory;
026import org.apache.logging.log4j.message.EntryMessage;
027import org.apache.logging.log4j.message.FlowMessageFactory;
028import org.apache.logging.log4j.message.Message;
029import org.apache.logging.log4j.message.MessageFactory;
030import org.apache.logging.log4j.message.MessageFactory2;
031import org.apache.logging.log4j.message.ParameterizedMessage;
032import org.apache.logging.log4j.message.ParameterizedMessageFactory;
033import org.apache.logging.log4j.message.ReusableMessageFactory;
034import org.apache.logging.log4j.message.SimpleMessage;
035import org.apache.logging.log4j.message.StringFormattedMessage;
036import org.apache.logging.log4j.status.StatusLogger;
037import org.apache.logging.log4j.util.Constants;
038import org.apache.logging.log4j.util.LambdaUtil;
039import org.apache.logging.log4j.util.LoaderUtil;
040import org.apache.logging.log4j.util.MessageSupplier;
041import org.apache.logging.log4j.util.PerformanceSensitive;
042import org.apache.logging.log4j.util.PropertiesUtil;
043import org.apache.logging.log4j.util.StackLocatorUtil;
044import org.apache.logging.log4j.util.Strings;
045import org.apache.logging.log4j.util.Supplier;
046
047/**
048 * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class.
049 */
050public abstract class AbstractLogger implements ExtendedLogger, LocationAwareLogger, Serializable {
051    // Implementation note: many methods in this class are tuned for performance. MODIFY WITH CARE!
052    // Specifically, try to keep the hot methods to 35 bytecodes or less:
053    // this is within the MaxInlineSize threshold on Java 7 and Java 8 Hotspot and makes these methods
054    // candidates for immediate inlining instead of waiting until they are designated "hot enough".
055
056    /**
057     * Marker for flow tracing.
058     */
059    public static final Marker FLOW_MARKER = MarkerManager.getMarker("FLOW");
060
061    /**
062     * Marker for method entry tracing.
063     */
064    public static final Marker ENTRY_MARKER = MarkerManager.getMarker("ENTER").setParents(FLOW_MARKER);
065
066    /**
067     * Marker for method exit tracing.
068     */
069    public static final Marker EXIT_MARKER = MarkerManager.getMarker("EXIT").setParents(FLOW_MARKER);
070
071    /**
072     * Marker for exception tracing.
073     */
074    public static final Marker EXCEPTION_MARKER = MarkerManager.getMarker("EXCEPTION");
075
076    /**
077     * Marker for throwing exceptions.
078     */
079    public static final Marker THROWING_MARKER = MarkerManager.getMarker("THROWING").setParents(EXCEPTION_MARKER);
080
081    /**
082     * Marker for catching exceptions.
083     */
084    public static final Marker CATCHING_MARKER = MarkerManager.getMarker("CATCHING").setParents(EXCEPTION_MARKER);
085
086    /**
087     * The default MessageFactory class.
088     */
089    public static final Class<? extends MessageFactory> DEFAULT_MESSAGE_FACTORY_CLASS =
090            createClassForProperty("log4j2.messageFactory", ReusableMessageFactory.class,
091                    ParameterizedMessageFactory.class);
092
093    /**
094     * The default FlowMessageFactory class.
095     */
096    public static final Class<? extends FlowMessageFactory> DEFAULT_FLOW_MESSAGE_FACTORY_CLASS =
097            createFlowClassForProperty("log4j2.flowMessageFactory", DefaultFlowMessageFactory.class);
098
099    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}