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.slf4j;
018
019import org.apache.logging.log4j.Level;
020import org.apache.logging.log4j.Marker;
021import org.apache.logging.log4j.message.LoggerNameAwareMessage;
022import org.apache.logging.log4j.message.Message;
023import org.apache.logging.log4j.message.MessageFactory;
024import org.apache.logging.log4j.spi.AbstractLogger;
025import org.slf4j.MarkerFactory;
026import org.slf4j.spi.LocationAwareLogger;
027
028public class SLF4JLogger extends AbstractLogger {
029
030    private static final long serialVersionUID = 1L;
031    private final org.slf4j.Logger logger;
032    private final LocationAwareLogger locationAwareLogger;
033
034    public SLF4JLogger(final String name, final MessageFactory messageFactory, final org.slf4j.Logger logger) {
035        super(name, messageFactory);
036        this.logger = logger;
037        this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null;
038    }
039
040    public SLF4JLogger(final String name, final org.slf4j.Logger logger) {
041        super(name);
042        this.logger = logger;
043        this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null;
044    }
045
046    private int convertLevel(final Level level) {
047        switch (level.getStandardLevel()) {
048            case DEBUG :
049                return LocationAwareLogger.DEBUG_INT;
050            case TRACE :
051                return LocationAwareLogger.TRACE_INT;
052            case INFO :
053                return LocationAwareLogger.INFO_INT;
054            case WARN :
055                return LocationAwareLogger.WARN_INT;
056            case ERROR :
057                return LocationAwareLogger.ERROR_INT;
058            default :
059                return LocationAwareLogger.ERROR_INT;
060        }
061    }
062
063    @Override
064    public Level getLevel() {
065        if (logger.isTraceEnabled()) {
066            return Level.TRACE;
067        }
068        if (logger.isDebugEnabled()) {
069            return Level.DEBUG;
070        }
071        if (logger.isInfoEnabled()) {
072            return Level.INFO;
073        }
074        if (logger.isWarnEnabled()) {
075            return Level.WARN;
076        }
077        if (logger.isErrorEnabled()) {
078            return Level.ERROR;
079        }
080        // Option: throw new IllegalStateException("Unknown SLF4JLevel");
081        // Option: return Level.ALL;
082        return Level.OFF;
083    }
084
085    public org.slf4j.Logger getLogger() {
086        return locationAwareLogger != null ? locationAwareLogger : logger;
087    }
088
089    private static org.slf4j.Marker getMarker(final Marker marker) {
090        // No marker is provided in the common case, small methods
091        // are optimized more effectively.
092        return marker == null ? null : convertMarker(marker);
093    }
094
095    private static org.slf4j.Marker convertMarker(final Marker marker) {
096        final org.slf4j.Marker slf4jMarker = MarkerFactory.getMarker(marker.getName());
097        final Marker[] parents = marker.getParents();
098        if (parents != null) {
099            for (final Marker parent : parents) {
100                final org.slf4j.Marker slf4jParent = getMarker(parent);
101                if (!slf4jMarker.contains(slf4jParent)) {
102                    slf4jMarker.add(slf4jParent);
103                }
104            }
105        }
106        return slf4jMarker;
107    }
108
109    @Override
110    public boolean isEnabled(final Level level, final Marker marker, final Message data, final Throwable t) {
111        return isEnabledFor(level, marker);
112    }
113
114    @Override
115    public boolean isEnabled(final Level level, final Marker marker, final CharSequence data, final Throwable t) {
116        return isEnabledFor(level, marker);
117    }
118
119    @Override
120    public boolean isEnabled(final Level level, final Marker marker, final Object data, final Throwable t) {
121        return isEnabledFor(level, marker);
122    }
123
124    @Override
125    public boolean isEnabled(final Level level, final Marker marker, final String data) {
126        return isEnabledFor(level, marker);
127    }
128
129    @Override
130    public boolean isEnabled(final Level level, final Marker marker, final String data, final Object... p1) {
131        return isEnabledFor(level, marker);
132    }
133
134    @Override
135    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0) {
136        return isEnabledFor(level, marker);
137    }
138
139    @Override
140    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
141            final Object p1) {
142        return isEnabledFor(level, marker);
143    }
144
145    @Override
146    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
147            final Object p1, final Object p2) {
148        return isEnabledFor(level, marker);
149    }
150
151    @Override
152    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
153            final Object p1, final Object p2, final Object p3) {
154        return isEnabledFor(level, marker);
155    }
156
157    @Override
158    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
159            final Object p1, final Object p2, final Object p3,
160            final Object p4) {
161        return isEnabledFor(level, marker);
162    }
163
164    @Override
165    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
166            final Object p1, final Object p2, final Object p3,
167            final Object p4, final Object p5) {
168        return isEnabledFor(level, marker);
169    }
170
171    @Override
172    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
173            final Object p1, final Object p2, final Object p3,
174            final Object p4, final Object p5, final Object p6) {
175        return isEnabledFor(level, marker);
176    }
177
178    @Override
179    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
180            final Object p1, final Object p2, final Object p3,
181            final Object p4, final Object p5, final Object p6,
182            final Object p7) {
183        return isEnabledFor(level, marker);
184    }
185
186    @Override
187    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
188            final Object p1, final Object p2, final Object p3,
189            final Object p4, final Object p5, final Object p6,
190            final Object p7, final Object p8) {
191        return isEnabledFor(level, marker);
192    }
193
194    @Override
195    public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
196            final Object p1, final Object p2, final Object p3,
197            final Object p4, final Object p5, final Object p6,
198            final Object p7, final Object p8, final Object p9) {
199        return isEnabledFor(level, marker);
200    }
201
202    @Override
203    public boolean isEnabled(final Level level, final Marker marker, final String data, final Throwable t) {
204        return isEnabledFor(level, marker);
205    }
206
207    private boolean isEnabledFor(final Level level, final Marker marker) {
208        final org.slf4j.Marker slf4jMarker = getMarker(marker);
209        switch (level.getStandardLevel()) {
210            case DEBUG :
211                return logger.isDebugEnabled(slf4jMarker);
212            case TRACE :
213                return logger.isTraceEnabled(slf4jMarker);
214            case INFO :
215                return logger.isInfoEnabled(slf4jMarker);
216            case WARN :
217                return logger.isWarnEnabled(slf4jMarker);
218            case ERROR :
219                return logger.isErrorEnabled(slf4jMarker);
220            default :
221                return logger.isErrorEnabled(slf4jMarker);
222
223        }
224    }
225
226    @Override
227    public void logMessage(final String fqcn, final Level level, final Marker marker, final Message message, final Throwable t) {
228        org.slf4j.Marker slf4jMarker = getMarker(marker);
229        String formattedMessage = message.getFormattedMessage();
230        if (locationAwareLogger != null) {
231            if (message instanceof LoggerNameAwareMessage) {
232                ((LoggerNameAwareMessage) message).setLoggerName(getName());
233            }
234            locationAwareLogger.log(slf4jMarker, fqcn, convertLevel(level), formattedMessage, null, t);
235        } else {
236            switch (level.getStandardLevel()) {
237                case DEBUG :
238                    logger.debug(slf4jMarker, formattedMessage, t);
239                    break;
240                case TRACE :
241                    logger.trace(slf4jMarker, formattedMessage, t);
242                    break;
243                case INFO :
244                    logger.info(slf4jMarker, formattedMessage, t);
245                    break;
246                case WARN :
247                    logger.warn(slf4jMarker, formattedMessage, t);
248                    break;
249                case ERROR :
250                    logger.error(slf4jMarker, formattedMessage, t);
251                    break;
252                default :
253                    logger.error(slf4jMarker, formattedMessage, t);
254                    break;
255            }
256        }
257    }
258
259}