View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements. See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache license, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License. You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the license for the specific language governing permissions and
15   * limitations under the license.
16   */
17  package org.apache.logging.slf4j;
18  
19  import org.apache.logging.log4j.Level;
20  import org.apache.logging.log4j.Marker;
21  import org.apache.logging.log4j.message.LoggerNameAwareMessage;
22  import org.apache.logging.log4j.message.Message;
23  import org.apache.logging.log4j.message.MessageFactory;
24  import org.apache.logging.log4j.spi.AbstractLogger;
25  import org.slf4j.MarkerFactory;
26  import org.slf4j.spi.LocationAwareLogger;
27  
28  public class SLF4JLogger extends AbstractLogger {
29  
30      private static final long serialVersionUID = 1L;
31      private final org.slf4j.Logger logger;
32      private final LocationAwareLogger locationAwareLogger;
33  
34      public SLF4JLogger(final String name, final MessageFactory messageFactory, final org.slf4j.Logger logger) {
35          super(name, messageFactory);
36          this.logger = logger;
37          this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null;
38      }
39  
40      public SLF4JLogger(final String name, final org.slf4j.Logger logger) {
41          super(name);
42          this.logger = logger;
43          this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null;
44      }
45  
46      private int convertLevel(final Level level) {
47          switch (level.getStandardLevel()) {
48              case DEBUG :
49                  return LocationAwareLogger.DEBUG_INT;
50              case TRACE :
51                  return LocationAwareLogger.TRACE_INT;
52              case INFO :
53                  return LocationAwareLogger.INFO_INT;
54              case WARN :
55                  return LocationAwareLogger.WARN_INT;
56              case ERROR :
57                  return LocationAwareLogger.ERROR_INT;
58              default :
59                  return LocationAwareLogger.ERROR_INT;
60          }
61      }
62  
63      @Override
64      public Level getLevel() {
65          if (logger.isTraceEnabled()) {
66              return Level.TRACE;
67          }
68          if (logger.isDebugEnabled()) {
69              return Level.DEBUG;
70          }
71          if (logger.isInfoEnabled()) {
72              return Level.INFO;
73          }
74          if (logger.isWarnEnabled()) {
75              return Level.WARN;
76          }
77          if (logger.isErrorEnabled()) {
78              return Level.ERROR;
79          }
80          // Option: throw new IllegalStateException("Unknown SLF4JLevel");
81          // Option: return Level.ALL;
82          return Level.OFF;
83      }
84  
85      public org.slf4j.Logger getLogger() {
86          return locationAwareLogger != null ? locationAwareLogger : logger;
87      }
88  
89      private static org.slf4j.Marker getMarker(final Marker marker) {
90          // No marker is provided in the common case, small methods
91          // are optimized more effectively.
92          return marker == null ? null : convertMarker(marker);
93      }
94  
95      private static org.slf4j.Marker convertMarker(final Marker marker) {
96          final org.slf4j.Marker slf4jMarker = MarkerFactory.getMarker(marker.getName());
97          final Marker[] parents = marker.getParents();
98          if (parents != null) {
99              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 }