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.Marker;
023import org.apache.logging.log4j.MarkerManager;
024import org.apache.logging.log4j.message.Message;
025import org.apache.logging.log4j.message.MessageFactory;
026import org.apache.logging.log4j.message.ParameterizedMessageFactory;
027import org.apache.logging.log4j.message.StringFormattedMessage;
028import org.apache.logging.log4j.status.StatusLogger;
029
030/**
031 * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class.
032 */
033public abstract class AbstractLogger implements ExtendedLogger, Serializable {
034
035    private static final long serialVersionUID = 2L;
036
037    /**
038     * Marker for flow tracing.
039     */
040    public static final Marker FLOW_MARKER = MarkerManager.getMarker("FLOW");
041
042    /**
043     * Marker for method entry tracing.
044     */
045    public static final Marker ENTRY_MARKER = MarkerManager.getMarker("ENTRY").setParents(FLOW_MARKER);
046
047    /**
048     * Marker for method exit tracing.
049     */
050    public static final Marker EXIT_MARKER = MarkerManager.getMarker("EXIT").setParents(FLOW_MARKER);
051
052    /**
053     * Marker for exception tracing.
054     */
055    public static final Marker EXCEPTION_MARKER = MarkerManager.getMarker("EXCEPTION");
056
057    /**
058     * Marker for throwing exceptions.
059     */
060    public static final Marker THROWING_MARKER = MarkerManager.getMarker("THROWING").setParents(EXCEPTION_MARKER);
061
062    /**
063     * Marker for catching exceptions.
064     */
065    public static final Marker CATCHING_MARKER = MarkerManager.getMarker("CATCHING").setParents(EXCEPTION_MARKER);
066
067    /**
068     * The default MessageFactory class.
069     */
070    public static final Class<? extends MessageFactory> DEFAULT_MESSAGE_FACTORY_CLASS = ParameterizedMessageFactory.class;
071
072    private static final String FQCN = AbstractLogger.class.getName();
073
074    private static final String THROWING = "throwing";
075
076    private static final String CATCHING = "catching";
077
078    /**
079     * Checks that the message factory a logger was created with is the same as the given messageFactory. If they are
080     * different log a warning to the {@linkplain StatusLogger}. A null MessageFactory translates to the default
081     * MessageFactory {@link #DEFAULT_MESSAGE_FACTORY_CLASS}.
082     *
083     * @param logger The logger to check
084     * @param messageFactory The message factory to check.
085     */
086    public static void checkMessageFactory(final ExtendedLogger logger, final MessageFactory messageFactory) {
087        final String name = logger.getName();
088        final MessageFactory loggerMessageFactory = logger.getMessageFactory();
089        if (messageFactory != null && !loggerMessageFactory.equals(messageFactory)) {
090            StatusLogger.getLogger().warn(
091                    "The Logger {} was created with the message factory {} and is now requested with the "
092                            + "message factory {}, which may create log events with unexpected formatting.", name,
093                    loggerMessageFactory, messageFactory);
094        } else if (messageFactory == null && !loggerMessageFactory.getClass().equals(DEFAULT_MESSAGE_FACTORY_CLASS)) {
095            StatusLogger
096                    .getLogger()
097                    .warn("The Logger {} was created with the message factory {} and is now requested with a null "
098                            + "message factory (defaults to {}), which may create log events with unexpected formatting.",
099                            name, loggerMessageFactory, DEFAULT_MESSAGE_FACTORY_CLASS.getName());
100        }
101    }
102
103    private final String name;
104
105    private final MessageFactory messageFactory;
106
107    /**
108     * Creates a new logger named after this class (or subclass).
109     */
110    public AbstractLogger() {
111        this.name = getClass().getName();
112        this.messageFactory = createDefaultMessageFactory();
113    }
114
115    /**
116     * Creates a new named logger.
117     *
118     * @param name the logger name
119     */
120    public AbstractLogger(final String name) {
121        this.name = name;
122        this.messageFactory = createDefaultMessageFactory();
123    }
124
125    /**
126     * Creates a new named logger with a particular {@link MessageFactory}.
127     *
128     * @param name the logger name
129     * @param messageFactory the message factory, if null then use the default message factory.
130     */
131    public AbstractLogger(final String name, final MessageFactory messageFactory) {
132        this.name = name;
133        this.messageFactory = messageFactory == null ? createDefaultMessageFactory() : messageFactory;
134    }
135
136    @Override
137    public void catching(final Level level, final Throwable t) {
138        catching(FQCN, level, t);
139    }
140
141    /**
142     * Logs a Throwable that has been caught with location information.
143     *
144     * @param fqcn The fully qualified class name of the <b>caller</b>.
145     * @param level The logging level.
146     * @param t The Throwable.
147     */
148    protected void catching(final String fqcn, final Level level, final Throwable t) {
149        if (isEnabled(level, CATCHING_MARKER, (Object) null, null)) {
150            logMessage(fqcn, level, CATCHING_MARKER, catchingMsg(t), t);
151        }
152    }
153
154    @Override
155    public void catching(final Throwable t) {
156        if (isEnabled(Level.ERROR, CATCHING_MARKER, (Object) null, null)) {
157            logMessage(FQCN, Level.ERROR, CATCHING_MARKER, catchingMsg(t), t);
158        }
159    }
160
161    protected Message catchingMsg(final Throwable t) {
162        return messageFactory.newMessage(CATCHING);
163    }
164
165    private MessageFactory createDefaultMessageFactory() {
166        try {
167            return DEFAULT_MESSAGE_FACTORY_CLASS.newInstance();
168        } catch (final InstantiationException e) {
169            throw new IllegalStateException(e);
170        } catch (final IllegalAccessException e) {
171            throw new IllegalStateException(e);
172        }
173    }
174
175    @Override
176    public void debug(final Marker marker, final Message msg) {
177        logIfEnabled(FQCN, Level.DEBUG, marker, msg, null);
178    }
179
180    @Override
181    public void debug(final Marker marker, final Message msg, final Throwable t) {
182        logIfEnabled(FQCN, Level.DEBUG, marker, msg, t);
183    }
184
185    @Override
186    public void debug(final Marker marker, final Object message) {
187        logIfEnabled(FQCN, Level.DEBUG, marker, message, null);
188    }
189
190    @Override
191    public void debug(final Marker marker, final Object message, final Throwable t) {
192        logIfEnabled(FQCN, Level.DEBUG, marker, message, t);
193    }
194
195    @Override
196    public void debug(final Marker marker, final String message) {
197        logIfEnabled(FQCN, Level.DEBUG, marker, message, (Throwable) null);
198    }
199
200    @Override
201    public void debug(final Marker marker, final String message, final Object... params) {
202        logIfEnabled(FQCN, Level.DEBUG, marker, message, params);
203    }
204
205    @Override
206    public void debug(final Marker marker, final String message, final Throwable t) {
207        logIfEnabled(FQCN, Level.DEBUG, marker, message, t);
208    }
209
210    @Override
211    public void debug(final Message msg) {
212        logIfEnabled(FQCN, Level.DEBUG, null, msg, null);
213    }
214
215    @Override
216    public void debug(final Message msg, final Throwable t) {
217        logIfEnabled(FQCN, Level.DEBUG, null, msg, t);
218    }
219
220    @Override
221    public void debug(final Object message) {
222        logIfEnabled(FQCN, Level.DEBUG, null, message, null);
223    }
224
225    @Override
226    public void debug(final Object message, final Throwable t) {
227        logIfEnabled(FQCN, Level.DEBUG, null, message, t);
228    }
229
230    @Override
231    public void debug(final String message) {
232        logIfEnabled(FQCN, Level.DEBUG, null, message, (Throwable) null);
233    }
234
235    @Override
236    public void debug(final String message, final Object... params) {
237        logIfEnabled(FQCN, Level.DEBUG, null, message, params);
238    }
239
240    @Override
241    public void debug(final String message, final Throwable t) {
242        logIfEnabled(FQCN, Level.DEBUG, null, message, t);
243    }
244
245    @Override
246    public void entry() {
247        entry(FQCN);
248    }
249
250    @Override
251    public void entry(final Object... params) {
252        entry(FQCN, params);
253    }
254
255    /**
256     * Logs entry to a method with location information.
257     *
258     * @param fqcn The fully qualified class name of the <b>caller</b>.
259     * @param params The parameters to the method.
260     */
261    protected void entry(final String fqcn, final Object... params) {
262        if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) {
263            logIfEnabled(fqcn, Level.TRACE, ENTRY_MARKER, entryMsg(params.length, params), null);
264        }
265    }
266
267    protected Message entryMsg(final int count, final Object... params) {
268        if (count == 0) {
269            return messageFactory.newMessage("entry");
270        }
271        final StringBuilder sb = new StringBuilder("entry params(");
272        int i = 0;
273        for (final Object parm : params) {
274            if (parm != null) {
275                sb.append(parm.toString());
276            } else {
277                sb.append("null");
278            }
279            if (++i < params.length) {
280                sb.append(", ");
281            }
282        }
283        sb.append(')');
284        return messageFactory.newMessage(sb.toString());
285    }
286
287    @Override
288    public void error(final Marker marker, final Message msg) {
289        logIfEnabled(FQCN, Level.ERROR, marker, msg, null);
290    }
291
292    @Override
293    public void error(final Marker marker, final Message msg, final Throwable t) {
294        logIfEnabled(FQCN, Level.ERROR, marker, msg, t);
295    }
296
297    @Override
298    public void error(final Marker marker, final Object message) {
299        logIfEnabled(FQCN, Level.ERROR, marker, message, null);
300    }
301
302    @Override
303    public void error(final Marker marker, final Object message, final Throwable t) {
304        logIfEnabled(FQCN, Level.ERROR, marker, message, t);
305    }
306
307    @Override
308    public void error(final Marker marker, final String message) {
309        logIfEnabled(FQCN, Level.ERROR, marker, message, (Throwable) null);
310    }
311
312    @Override
313    public void error(final Marker marker, final String message, final Object... params) {
314        logIfEnabled(FQCN, Level.ERROR, marker, message, params);
315    }
316
317    @Override
318    public void error(final Marker marker, final String message, final Throwable t) {
319        logIfEnabled(FQCN, Level.ERROR, marker, message, t);
320    }
321
322    @Override
323    public void error(final Message msg) {
324        logIfEnabled(FQCN, Level.ERROR, null, msg, null);
325    }
326
327    @Override
328    public void error(final Message msg, final Throwable t) {
329        logIfEnabled(FQCN, Level.ERROR, null, msg, t);
330    }
331
332    @Override
333    public void error(final Object message) {
334        logIfEnabled(FQCN, Level.ERROR, null, message, null);
335    }
336
337    @Override
338    public void error(final Object message, final Throwable t) {
339        logIfEnabled(FQCN, Level.ERROR, null, message, t);
340    }
341
342    @Override
343    public void error(final String message) {
344        logIfEnabled(FQCN, Level.ERROR, null, message, (Throwable) null);
345    }
346
347    @Override
348    public void error(final String message, final Object... params) {
349        logIfEnabled(FQCN, Level.ERROR, null, message, params);
350    }
351
352    @Override
353    public void error(final String message, final Throwable t) {
354        logIfEnabled(FQCN, Level.ERROR, null, message, t);
355    }
356
357    @Override
358    public void exit() {
359        exit(FQCN, null);
360    }
361
362    @Override
363    public <R> R exit(final R result) {
364        return exit(FQCN, result);
365    }
366
367    /**
368     * Logs exiting from a method with the result and location information.
369     *
370     * @param fqcn The fully qualified class name of the <b>caller</b>.
371     * @param <R> The type of the parameter and object being returned.
372     * @param result The result being returned from the method call.
373     * @return the return value passed to this method.
374     */
375    protected <R> R exit(final String fqcn, final R result) {
376        if (isEnabled(Level.TRACE, EXIT_MARKER, (Object) null, null)) {
377            logIfEnabled(fqcn, Level.TRACE, EXIT_MARKER, exitMsg(result), null);
378        }
379        return result;
380    }
381
382    protected Message exitMsg(final Object result) {
383        if (result == null) {
384            return messageFactory.newMessage("exit");
385        }
386        return messageFactory.newMessage("exit with(" + result + ')');
387    }
388
389    @Override
390    public void fatal(final Marker marker, final Message msg) {
391        logIfEnabled(FQCN, Level.FATAL, marker, msg, null);
392    }
393
394    @Override
395    public void fatal(final Marker marker, final Message msg, final Throwable t) {
396        logIfEnabled(FQCN, Level.FATAL, marker, msg, t);
397    }
398
399    @Override
400    public void fatal(final Marker marker, final Object message) {
401        logIfEnabled(FQCN, Level.FATAL, marker, message, null);
402    }
403
404    @Override
405    public void fatal(final Marker marker, final Object message, final Throwable t) {
406        logIfEnabled(FQCN, Level.FATAL, marker, message, t);
407    }
408
409    @Override
410    public void fatal(final Marker marker, final String message) {
411        logIfEnabled(FQCN, Level.FATAL, marker, message, (Throwable) null);
412    }
413
414    @Override
415    public void fatal(final Marker marker, final String message, final Object... params) {
416        logIfEnabled(FQCN, Level.FATAL, marker, message, params);
417    }
418
419    @Override
420    public void fatal(final Marker marker, final String message, final Throwable t) {
421        logIfEnabled(FQCN, Level.FATAL, marker, message, t);
422    }
423
424    @Override
425    public void fatal(final Message msg) {
426        logIfEnabled(FQCN, Level.FATAL, null, msg, null);
427    }
428
429    @Override
430    public void fatal(final Message msg, final Throwable t) {
431        logIfEnabled(FQCN, Level.FATAL, null, msg, t);
432    }
433
434    @Override
435    public void fatal(final Object message) {
436        logIfEnabled(FQCN, Level.FATAL, null, message, null);
437    }
438
439    @Override
440    public void fatal(final Object message, final Throwable t) {
441        logIfEnabled(FQCN, Level.FATAL, null, message, t);
442    }
443
444    @Override
445    public void fatal(final String message) {
446        logIfEnabled(FQCN, Level.FATAL, null, message, (Throwable) null);
447    }
448
449    @Override
450    public void fatal(final String message, final Object... params) {
451        logIfEnabled(FQCN, Level.FATAL, null, message, params);
452    }
453
454    @Override
455    public void fatal(final String message, final Throwable t) {
456        logIfEnabled(FQCN, Level.FATAL, null, message, t);
457    }
458
459    @Override
460    public MessageFactory getMessageFactory() {
461        return messageFactory;
462    }
463
464    @Override
465    public String getName() {
466        return name;
467    }
468
469    @Override
470    public void info(final Marker marker, final Message msg) {
471        logIfEnabled(FQCN, Level.INFO, marker, msg, null);
472    }
473
474    @Override
475    public void info(final Marker marker, final Message msg, final Throwable t) {
476        logIfEnabled(FQCN, Level.INFO, marker, msg, t);
477    }
478
479    @Override
480    public void info(final Marker marker, final Object message) {
481        logIfEnabled(FQCN, Level.INFO, marker, message, null);
482    }
483
484    @Override
485    public void info(final Marker marker, final Object message, final Throwable t) {
486        logIfEnabled(FQCN, Level.INFO, marker, message, t);
487    }
488
489    @Override
490    public void info(final Marker marker, final String message) {
491        logIfEnabled(FQCN, Level.INFO, marker, message, (Throwable) null);
492    }
493
494    @Override
495    public void info(final Marker marker, final String message, final Object... params) {
496        logIfEnabled(FQCN, Level.INFO, marker, message, params);
497    }
498
499    @Override
500    public void info(final Marker marker, final String message, final Throwable t) {
501        logIfEnabled(FQCN, Level.INFO, marker, message, t);
502    }
503
504    @Override
505    public void info(final Message msg) {
506        logIfEnabled(FQCN, Level.INFO, null, msg, null);
507    }
508
509    @Override
510    public void info(final Message msg, final Throwable t) {
511        logIfEnabled(FQCN, Level.INFO, null, msg, t);
512    }
513
514    @Override
515    public void info(final Object message) {
516        logIfEnabled(FQCN, Level.INFO, null, message, null);
517    }
518
519    @Override
520    public void info(final Object message, final Throwable t) {
521        logIfEnabled(FQCN, Level.INFO, null, message, t);
522    }
523
524    @Override
525    public void info(final String message) {
526        logIfEnabled(FQCN, Level.INFO, null, message, (Throwable) null);
527    }
528
529    @Override
530    public void info(final String message, final Object... params) {
531        logIfEnabled(FQCN, Level.INFO, null, message, params);
532    }
533
534    @Override
535    public void info(final String message, final Throwable t) {
536        logIfEnabled(FQCN, Level.INFO, null, message, t);
537    }
538
539    @Override
540    public boolean isDebugEnabled() {
541        return isEnabled(Level.DEBUG, null, null);
542    }
543
544    @Override
545    public boolean isDebugEnabled(final Marker marker) {
546        return isEnabled(Level.DEBUG, marker, (Object) null, null);
547    }
548
549    @Override
550    public boolean isEnabled(final Level level) {
551        return isEnabled(level, null, (Object) null, null);
552    }
553
554    @Override
555    public boolean isEnabled(final Level level, final Marker marker) {
556        return isEnabled(level, marker, (Object) null, null);
557    }
558
559    @Override
560    public boolean isErrorEnabled() {
561        return isEnabled(Level.ERROR, null, (Object) null, null);
562    }
563
564    @Override
565    public boolean isErrorEnabled(final Marker marker) {
566        return isEnabled(Level.ERROR, marker, (Object) null, null);
567    }
568
569    @Override
570    public boolean isFatalEnabled() {
571        return isEnabled(Level.FATAL, null, (Object) null, null);
572    }
573
574    @Override
575    public boolean isFatalEnabled(final Marker marker) {
576        return isEnabled(Level.FATAL, marker, (Object) null, null);
577    }
578
579    @Override
580    public boolean isInfoEnabled() {
581        return isEnabled(Level.INFO, null, (Object) null, null);
582    }
583
584    @Override
585    public boolean isInfoEnabled(final Marker marker) {
586        return isEnabled(Level.INFO, marker, (Object) null, null);
587    }
588
589    @Override
590    public boolean isTraceEnabled() {
591        return isEnabled(Level.TRACE, null, (Object) null, null);
592    }
593
594    @Override
595    public boolean isTraceEnabled(final Marker marker) {
596        return isEnabled(Level.TRACE, marker, (Object) null, null);
597    }
598
599    @Override
600    public boolean isWarnEnabled() {
601        return isEnabled(Level.WARN, null, (Object) null, null);
602    }
603
604    @Override
605    public boolean isWarnEnabled(final Marker marker) {
606        return isEnabled(Level.WARN, marker, (Object) null, null);
607    }
608
609    @Override
610    public void log(final Level level, final Marker marker, final Message msg) {
611        logIfEnabled(FQCN, level, marker, msg, (Throwable) null);
612    }
613
614    @Override
615    public void log(final Level level, final Marker marker, final Message msg, final Throwable t) {
616        logIfEnabled(FQCN, level, marker, msg, t);
617    }
618
619    @Override
620    public void log(final Level level, final Marker marker, final Object message) {
621        logIfEnabled(FQCN, level, marker, message, (Throwable) null);
622    }
623
624    @Override
625    public void log(final Level level, final Marker marker, final Object message, final Throwable t) {
626        if (isEnabled(level, marker, message, t)) {
627            logMessage(FQCN, level, marker, message, t);
628        }
629    }
630
631    @Override
632    public void log(final Level level, final Marker marker, final String message) {
633        logIfEnabled(FQCN, level, marker, message, (Throwable) null);
634    }
635
636    @Override
637    public void log(final Level level, final Marker marker, final String message, final Object... params) {
638        logIfEnabled(FQCN, level, marker, message, params);
639    }
640
641    @Override
642    public void log(final Level level, final Marker marker, final String message, final Throwable t) {
643        logIfEnabled(FQCN, level, marker, message, t);
644    }
645
646    @Override
647    public void log(final Level level, final Message msg) {
648        logIfEnabled(FQCN, level, null, msg, null);
649    }
650
651    @Override
652    public void log(final Level level, final Message msg, final Throwable t) {
653        logIfEnabled(FQCN, level, null, msg, t);
654    }
655
656    @Override
657    public void log(final Level level, final Object message) {
658        logIfEnabled(FQCN, level, null, message, null);
659    }
660
661    @Override
662    public void log(final Level level, final Object message, final Throwable t) {
663        logIfEnabled(FQCN, level, null, message, t);
664    }
665
666    @Override
667    public void log(final Level level, final String message) {
668        logIfEnabled(FQCN, level, null, message, (Throwable) null);
669    }
670
671    @Override
672    public void log(final Level level, final String message, final Object... params) {
673        logIfEnabled(FQCN, level, null, message, params);
674    }
675
676    @Override
677    public void log(final Level level, final String message, final Throwable t) {
678        logIfEnabled(FQCN, level, null, message, t);
679    }
680
681    @Override
682    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Message msg,
683            final Throwable t) {
684        if (isEnabled(level, marker, msg, t)) {
685            logMessage(fqcn, level, marker, msg, t);
686        }
687    }
688
689    @Override
690    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Object message,
691            final Throwable t) {
692        if (isEnabled(level, marker, message, t)) {
693            logMessage(fqcn, level, marker, message, t);
694        }
695    }
696
697    @Override
698    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message) {
699        if (isEnabled(level, marker, message)) {
700            logMessage(fqcn, level, marker, message);
701        }
702    }
703
704    @Override
705    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
706            final Object... params) {
707        if (isEnabled(level, marker, message, params)) {
708            logMessage(fqcn, level, marker, message, params);
709        }
710    }
711
712    @Override
713    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
714            final Throwable t) {
715        if (isEnabled(level, marker, message, t)) {
716            logMessage(fqcn, level, marker, message, t);
717        }
718    }
719
720    protected void logMessage(final String fqcn, final Level level, final Marker marker, final Object message,
721            final Throwable t) {
722        logMessage(fqcn, level, marker, messageFactory.newMessage(message), t);
723    }
724
725    protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
726            final Throwable t) {
727        logMessage(fqcn, level, marker, messageFactory.newMessage(message), t);
728    }
729
730    protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message) {
731        final Message msg = messageFactory.newMessage(message);
732        logMessage(fqcn, level, marker, msg, msg.getThrowable());
733    }
734
735    protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
736            final Object... params) {
737        final Message msg = messageFactory.newMessage(message, params);
738        logMessage(fqcn, level, marker, msg, msg.getThrowable());
739    }
740
741    @Override
742    public void printf(final Level level, final Marker marker, final String format, final Object... params) {
743        if (isEnabled(level, marker, format, params)) {
744            final Message msg = new StringFormattedMessage(format, params);
745            logMessage(FQCN, level, marker, msg, msg.getThrowable());
746        }
747    }
748
749    @Override
750    public void printf(final Level level, final String format, final Object... params) {
751        if (isEnabled(level, null, format, params)) {
752            final Message msg = new StringFormattedMessage(format, params);
753            logMessage(FQCN, level, null, msg, msg.getThrowable());
754        }
755    }
756
757    @Override
758    public <T extends Throwable> T throwing(final T t) {
759        return throwing(FQCN, Level.ERROR, t);
760    }
761
762    @Override
763    public <T extends Throwable> T throwing(final Level level, final T t) {
764        return throwing(FQCN, level, t);
765    }
766
767    /**
768     * Logs a Throwable to be thrown.
769     *
770     * @param <T> the type of the Throwable.
771     * @param fqcn the fully qualified class name of this Logger implementation.
772     * @param level The logging Level.
773     * @param t The Throwable.
774     * @return the Throwable.
775     */
776    protected <T extends Throwable> T throwing(final String fqcn, final Level level, final T t) {
777        if (isEnabled(level, THROWING_MARKER, (Object) null, null)) {
778            logMessage(fqcn, level, THROWING_MARKER, throwingMsg(t), t);
779        }
780        return t;
781    }
782
783    protected Message throwingMsg(final Throwable t) {
784        return messageFactory.newMessage(THROWING);
785    }
786
787    @Override
788    public void trace(final Marker marker, final Message msg) {
789        logIfEnabled(FQCN, Level.TRACE, marker, msg, null);
790    }
791
792    @Override
793    public void trace(final Marker marker, final Message msg, final Throwable t) {
794        logIfEnabled(FQCN, Level.TRACE, marker, msg, t);
795    }
796
797    @Override
798    public void trace(final Marker marker, final Object message) {
799        logIfEnabled(FQCN, Level.TRACE, marker, message, null);
800    }
801
802    @Override
803    public void trace(final Marker marker, final Object message, final Throwable t) {
804        logIfEnabled(FQCN, Level.TRACE, marker, message, t);
805    }
806
807    @Override
808    public void trace(final Marker marker, final String message) {
809        logIfEnabled(FQCN, Level.TRACE, marker, message, (Throwable) null);
810    }
811
812    @Override
813    public void trace(final Marker marker, final String message, final Object... params) {
814        logIfEnabled(FQCN, Level.TRACE, marker, message, params);
815    }
816
817    @Override
818    public void trace(final Marker marker, final String message, final Throwable t) {
819        logIfEnabled(FQCN, Level.TRACE, marker, message, t);
820    }
821
822    @Override
823    public void trace(final Message msg) {
824        logIfEnabled(FQCN, Level.TRACE, null, msg, null);
825    }
826
827    @Override
828    public void trace(final Message msg, final Throwable t) {
829        logIfEnabled(FQCN, Level.TRACE, null, msg, t);
830    }
831
832    @Override
833    public void trace(final Object message) {
834        logIfEnabled(FQCN, Level.TRACE, null, message, null);
835    }
836
837    @Override
838    public void trace(final Object message, final Throwable t) {
839        logIfEnabled(FQCN, Level.TRACE, null, message, t);
840    }
841
842    @Override
843    public void trace(final String message) {
844        logIfEnabled(FQCN, Level.TRACE, null, message, (Throwable) null);
845    }
846
847    @Override
848    public void trace(final String message, final Object... params) {
849        logIfEnabled(FQCN, Level.TRACE, null, message, params);
850    }
851
852    @Override
853    public void trace(final String message, final Throwable t) {
854        logIfEnabled(FQCN, Level.TRACE, null, message, t);
855    }
856
857    @Override
858    public void warn(final Marker marker, final Message msg) {
859        logIfEnabled(FQCN, Level.WARN, marker, msg, null);
860    }
861
862    @Override
863    public void warn(final Marker marker, final Message msg, final Throwable t) {
864        logIfEnabled(FQCN, Level.WARN, marker, msg, t);
865    }
866
867    @Override
868    public void warn(final Marker marker, final Object message) {
869        logIfEnabled(FQCN, Level.WARN, marker, message, null);
870    }
871
872    /* -- FIXME: this comment looks lost
873     * Instead of one single method with Object... declared the following methods explicitly specify parameters because
874     * they perform dramatically better than having the JVM convert them to an array.
875     */
876
877    @Override
878    public void warn(final Marker marker, final Object message, final Throwable t) {
879        logIfEnabled(FQCN, Level.WARN, marker, message, t);
880    }
881
882    @Override
883    public void warn(final Marker marker, final String message) {
884        logIfEnabled(FQCN, Level.WARN, marker, message, (Throwable) null);
885    }
886
887    @Override
888    public void warn(final Marker marker, final String message, final Object... params) {
889        logIfEnabled(FQCN, Level.WARN, marker, message, params);
890    }
891
892    @Override
893    public void warn(final Marker marker, final String message, final Throwable t) {
894        logIfEnabled(FQCN, Level.WARN, marker, message, t);
895    }
896
897    @Override
898    public void warn(final Message msg) {
899        logIfEnabled(FQCN, Level.WARN, null, msg, null);
900    }
901
902    @Override
903    public void warn(final Message msg, final Throwable t) {
904        logIfEnabled(FQCN, Level.WARN, null, msg, t);
905    }
906
907    @Override
908    public void warn(final Object message) {
909        logIfEnabled(FQCN, Level.WARN, null, message, null);
910    }
911
912    @Override
913    public void warn(final Object message, final Throwable t) {
914        logIfEnabled(FQCN, Level.WARN, null, message, t);
915    }
916
917    @Override
918    public void warn(final String message) {
919        logIfEnabled(FQCN, Level.WARN, null, message, (Throwable) null);
920    }
921
922    @Override
923    public void warn(final String message, final Object... params) {
924        logIfEnabled(FQCN, Level.WARN, null, message, params);
925    }
926
927    @Override
928    public void warn(final String message, final Throwable t) {
929        logIfEnabled(FQCN, Level.WARN, null, message, t);
930    }
931
932}