001/*
002 * This is free and unencumbered software released into the public domain.
003 *
004 * Please see https://github.com/binkley/binkley/blob/master/LICENSE.md.
005 */
006
007package hm.binkley.util.logging;
008
009import org.slf4j.Logger;
010import org.slf4j.Marker;
011import org.slf4j.ext.LoggerWrapper;
012
013import javax.annotation.Nonnull;
014
015/**
016 * {@code MarkedLogger} is an SLF4J logger with a default marker applied to all methods with a
017 * marker variant.
018 * <p/>
019 * Example: <pre>
020 *     final Marker marker = MarkerFactory.getMarker("AUDIT");
021 *     final Logger logger = new MarkedLogger(LoggerFactory.getLogger(getClass()), marker);
022 *     logger.error("Missing counterparty details on order: {}", order);
023 *     logger.error(marker, "Missing counterparty details on order: {}", order);
024 * </pre>
025 * Marks this logging event as "AUDIT".  Suitable logger configuration might redirect this event to
026 * Remedy.  Both logging lines are equivalent.
027 * <p/>
028 * In Logback configuration use {@code %marker} to print the marker in the encoder pattern.
029 *
030 * @author <a href="mailto:binkley@alumni.rice.edu">B. K. Oxley (binkley)</a>
031 */
032public class MarkedLogger
033        extends LoggerWrapper {
034    private final Marker marker;
035
036    /**
037     * Gets the underlying wrapped logger for extensions.
038     *
039     * @return the underlying logger, never missing
040     */
041    @Nonnull
042    public final Logger getUnderlying() {
043        return logger;
044    }
045
046    /**
047     * Constructds a new {@code MarkedLogger} for the given parameters.
048     *
049     * @param logger the logger to delegate to, never missing
050     * @param marker the marker for unmarked logging, never missing
051     */
052    public MarkedLogger(@Nonnull final Logger logger, @Nonnull final Marker marker) {
053        this(logger, MarkedLogger.class.getName(), marker);
054    }
055
056    /**
057     * Constructds a new {@code MarkedLogger} for the given parameters suitable as a base class.
058     *
059     * @param logger the logger to delegate to, never missing
060     * @param fqcn the fully-qualified class name of the extending logger, never missing
061     * @param marker the marker for unmarked logging, never missing
062     */
063    public MarkedLogger(@Nonnull final Logger logger, @Nonnull final String fqcn,
064            @Nonnull final Marker marker) {
065        super(logger, fqcn);
066        this.marker = marker;
067    }
068
069    @Override
070    public void trace(final String msg) {
071        trace(marker, msg);
072    }
073
074    @Override
075    public void trace(final String format, final Object arg) {
076        trace(marker, format, arg);
077    }
078
079    @Override
080    public void trace(final String format, final Object arg1, final Object arg2) {
081        trace(marker, format, arg1, arg2);
082    }
083
084    @Override
085    public void trace(final String format, final Object... args) {
086        trace(marker, format, args);
087    }
088
089    @Override
090    public void trace(final String msg, final Throwable t) {
091        trace(marker, msg, t);
092    }
093
094    @Override
095    public void debug(final String msg) {
096        debug(marker, msg);
097    }
098
099    @Override
100    public void debug(final String format, final Object arg) {
101        debug(marker, format, arg);
102    }
103
104    @Override
105    public void debug(final String format, final Object arg1, final Object arg2) {
106        debug(marker, format, arg1, arg2);
107    }
108
109    @Override
110    public void debug(final String format, final Object... args) {
111        debug(marker, format, args);
112    }
113
114    @Override
115    public void debug(final String msg, final Throwable t) {
116        debug(marker, msg, t);
117    }
118
119    @Override
120    public void info(final String msg) {
121        info(marker, msg);
122    }
123
124    @Override
125    public void info(final String format, final Object arg) {
126        info(marker, format, arg);
127    }
128
129    @Override
130    public void info(final String format, final Object arg1, final Object arg2) {
131        info(marker, format, arg1, arg2);
132    }
133
134    @Override
135    public void info(final String format, final Object... args) {
136        info(marker, format, args);
137    }
138
139    @Override
140    public void info(final String msg, final Throwable t) {
141        info(marker, msg, t);
142    }
143
144    @Override
145    public void warn(final String msg) {
146        warn(marker, msg);
147    }
148
149    @Override
150    public void warn(final String format, final Object arg) {
151        warn(marker, format, arg);
152    }
153
154    @Override
155    public void warn(final String format, final Object arg1, final Object arg2) {
156        warn(marker, format, arg1, arg2);
157    }
158
159    @Override
160    public void warn(final String format, final Object... args) {
161        warn(marker, format, args);
162    }
163
164    @Override
165    public void warn(final String msg, final Throwable t) {
166        warn(marker, msg, t);
167    }
168
169    @Override
170    public void error(final String msg) {
171        error(marker, msg);
172    }
173
174    @Override
175    public void error(final String format, final Object arg) {
176        error(marker, format, arg);
177    }
178
179    @Override
180    public void error(final String format, final Object arg1, final Object arg2) {
181        error(marker, format, arg1, arg2);
182    }
183
184    @Override
185    public void error(final String format, final Object... args) {
186        error(marker, format, args);
187    }
188
189    @Override
190    public void error(final String msg, final Throwable t) {
191        error(marker, msg, t);
192    }
193}