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 java.io.IOException;
20  import java.io.ObjectInputStream;
21  import java.io.ObjectOutputStream;
22  import java.io.Serializable;
23  
24  import org.apache.logging.log4j.Level;
25  import org.apache.logging.log4j.LogManager;
26  import org.apache.logging.log4j.message.Message;
27  import org.apache.logging.log4j.message.ParameterizedMessage;
28  import org.apache.logging.log4j.message.SimpleMessage;
29  import org.apache.logging.log4j.spi.ExtendedLogger;
30  import org.slf4j.Marker;
31  import org.slf4j.MarkerFactory;
32  import org.slf4j.spi.LocationAwareLogger;
33  
34  /**
35   * SLF4J logger implementation that uses Log4j.
36   */
37  public class Log4jLogger implements LocationAwareLogger, Serializable {
38  
39      public static final String FQCN = Log4jLogger.class.getName();
40  
41      private static final long serialVersionUID = 7869000638091304316L;
42      private static final Marker EVENT_MARKER = MarkerFactory.getMarker("EVENT");
43      private final boolean eventLogger;
44      private transient ExtendedLogger logger;
45      private final String name;
46      private transient EventDataConverter converter;
47  
48      public Log4jLogger(final ExtendedLogger logger, final String name) {
49          this.logger = logger;
50          this.eventLogger = "EventLogger".equals(name);
51          this.name = name;
52          this.converter = createConverter();
53      }
54  
55      @Override
56      public void trace(final String format) {
57          logger.logIfEnabled(FQCN, Level.TRACE, null, format);
58      }
59  
60      @Override
61      public void trace(final String format, final Object o) {
62          logger.logIfEnabled(FQCN, Level.TRACE, null, format, o);
63      }
64  
65      @Override
66      public void trace(final String format, final Object arg1, final Object arg2) {
67          logger.logIfEnabled(FQCN, Level.TRACE, null, format, arg1, arg2);
68      }
69  
70      @Override
71      public void trace(final String format, final Object... args) {
72          logger.logIfEnabled(FQCN, Level.TRACE, null, format, args);
73      }
74  
75      @Override
76      public void trace(final String format, final Throwable t) {
77          logger.logIfEnabled(FQCN, Level.TRACE, null, format, t);
78      }
79  
80      @Override
81      public boolean isTraceEnabled() {
82          return logger.isEnabled(Level.TRACE, null, null);
83      }
84  
85      @Override
86      public boolean isTraceEnabled(final Marker marker) {
87          return logger.isEnabled(Level.TRACE, getMarker(marker), null);
88      }
89  
90      @Override
91      public void trace(final Marker marker, final String s) {
92          logger.logIfEnabled(FQCN, Level.TRACE, getMarker(marker), s);
93      }
94  
95      @Override
96      public void trace(final Marker marker, final String s, final Object o) {
97          logger.logIfEnabled(FQCN, Level.TRACE, getMarker(marker), s, o);
98      }
99  
100     @Override
101     public void trace(final Marker marker, final String s, final Object o, final Object o1) {
102         logger.logIfEnabled(FQCN, Level.TRACE, getMarker(marker), s, o, o1);
103     }
104 
105     @Override
106     public void trace(final Marker marker, final String s, final Object... objects) {
107         logger.logIfEnabled(FQCN, Level.TRACE, getMarker(marker), s, objects);
108     }
109 
110     @Override
111     public void trace(final Marker marker, final String s, final Throwable throwable) {
112         logger.logIfEnabled(FQCN, Level.TRACE, getMarker(marker), s, throwable);
113     }
114 
115     @Override
116     public void debug(final String format) {
117         logger.logIfEnabled(FQCN, Level.DEBUG, null, format);
118     }
119 
120     @Override
121     public void debug(final String format, final Object o) {
122         logger.logIfEnabled(FQCN, Level.DEBUG, null, format, o);
123     }
124 
125     @Override
126     public void debug(final String format, final Object arg1, final Object arg2) {
127         logger.logIfEnabled(FQCN, Level.DEBUG, null, format, arg1, arg2);
128     }
129 
130     @Override
131     public void debug(final String format, final Object... args) {
132         logger.logIfEnabled(FQCN, Level.DEBUG, null, format, args);
133     }
134 
135     @Override
136     public void debug(final String format, final Throwable t) {
137         logger.logIfEnabled(FQCN, Level.DEBUG, null, format, t);
138     }
139 
140     @Override
141     public boolean isDebugEnabled() {
142         return logger.isEnabled(Level.DEBUG, null, null);
143     }
144 
145     @Override
146     public boolean isDebugEnabled(final Marker marker) {
147         return logger.isEnabled(Level.DEBUG, getMarker(marker), null);
148     }
149 
150     @Override
151     public void debug(final Marker marker, final String s) {
152         logger.logIfEnabled(FQCN, Level.DEBUG, getMarker(marker), s);
153     }
154 
155     @Override
156     public void debug(final Marker marker, final String s, final Object o) {
157         logger.logIfEnabled(FQCN, Level.DEBUG, getMarker(marker), s, o);
158     }
159 
160     @Override
161     public void debug(final Marker marker, final String s, final Object o, final Object o1) {
162         logger.logIfEnabled(FQCN, Level.DEBUG, getMarker(marker), s, o, o1);
163     }
164 
165     @Override
166     public void debug(final Marker marker, final String s, final Object... objects) {
167         logger.logIfEnabled(FQCN, Level.DEBUG, getMarker(marker), s, objects);
168     }
169 
170     @Override
171     public void debug(final Marker marker, final String s, final Throwable throwable) {
172         logger.logIfEnabled(FQCN, Level.DEBUG, getMarker(marker), s, throwable);
173     }
174 
175     @Override
176     public void info(final String format) {
177         logger.logIfEnabled(FQCN, Level.INFO, null, format);
178     }
179 
180     @Override
181     public void info(final String format, final Object o) {
182         logger.logIfEnabled(FQCN, Level.INFO, null, format, o);
183     }
184 
185     @Override
186     public void info(final String format, final Object arg1, final Object arg2) {
187         logger.logIfEnabled(FQCN, Level.INFO, null, format, arg1, arg2);
188     }
189 
190     @Override
191     public void info(final String format, final Object... args) {
192         logger.logIfEnabled(FQCN, Level.INFO, null, format, args);
193     }
194 
195     @Override
196     public void info(final String format, final Throwable t) {
197         logger.logIfEnabled(FQCN, Level.INFO, null, format, t);
198     }
199 
200     @Override
201     public boolean isInfoEnabled() {
202         return logger.isEnabled(Level.INFO, null, null);
203     }
204 
205     @Override
206     public boolean isInfoEnabled(final Marker marker) {
207         return logger.isEnabled(Level.INFO, getMarker(marker), null);
208     }
209 
210     @Override
211     public void info(final Marker marker, final String s) {
212         logger.logIfEnabled(FQCN, Level.INFO, getMarker(marker), s);
213     }
214 
215     @Override
216     public void info(final Marker marker, final String s, final Object o) {
217         logger.logIfEnabled(FQCN, Level.INFO, getMarker(marker), s, o);
218     }
219 
220     @Override
221     public void info(final Marker marker, final String s, final Object o, final Object o1) {
222         logger.logIfEnabled(FQCN, Level.INFO, getMarker(marker), s, o, o1);
223     }
224 
225     @Override
226     public void info(final Marker marker, final String s, final Object... objects) {
227         logger.logIfEnabled(FQCN, Level.INFO, getMarker(marker), s, objects);
228     }
229 
230     @Override
231     public void info(final Marker marker, final String s, final Throwable throwable) {
232         logger.logIfEnabled(FQCN, Level.INFO, getMarker(marker), s, throwable);
233     }
234 
235     @Override
236     public void warn(final String format) {
237         logger.logIfEnabled(FQCN, Level.WARN, null, format);
238     }
239 
240     @Override
241     public void warn(final String format, final Object o) {
242         logger.logIfEnabled(FQCN, Level.WARN, null, format, o);
243     }
244 
245     @Override
246     public void warn(final String format, final Object arg1, final Object arg2) {
247         logger.logIfEnabled(FQCN, Level.WARN, null, format, arg1, arg2);
248     }
249 
250     @Override
251     public void warn(final String format, final Object... args) {
252         logger.logIfEnabled(FQCN, Level.WARN, null, format, args);
253     }
254 
255     @Override
256     public void warn(final String format, final Throwable t) {
257         logger.logIfEnabled(FQCN, Level.WARN, null, format, t);
258     }
259 
260     @Override
261     public boolean isWarnEnabled() {
262         return logger.isEnabled(Level.WARN, null, null);
263     }
264 
265     @Override
266     public boolean isWarnEnabled(final Marker marker) {
267         return logger.isEnabled(Level.WARN, getMarker(marker), null);
268     }
269 
270     @Override
271     public void warn(final Marker marker, final String s) {
272         logger.logIfEnabled(FQCN, Level.WARN, getMarker(marker), s);
273     }
274 
275     @Override
276     public void warn(final Marker marker, final String s, final Object o) {
277         logger.logIfEnabled(FQCN, Level.WARN, getMarker(marker), s, o);
278     }
279 
280     @Override
281     public void warn(final Marker marker, final String s, final Object o, final Object o1) {
282         logger.logIfEnabled(FQCN, Level.WARN, getMarker(marker), s, o, o1);
283     }
284 
285     @Override
286     public void warn(final Marker marker, final String s, final Object... objects) {
287         logger.logIfEnabled(FQCN, Level.WARN, getMarker(marker), s, objects);
288     }
289 
290     @Override
291     public void warn(final Marker marker, final String s, final Throwable throwable) {
292         logger.logIfEnabled(FQCN, Level.WARN, getMarker(marker), s, throwable);
293     }
294 
295     @Override
296     public void error(final String format) {
297         logger.logIfEnabled(FQCN, Level.ERROR, null, format);
298     }
299 
300     @Override
301     public void error(final String format, final Object o) {
302         logger.logIfEnabled(FQCN, Level.ERROR, null, format, o);
303     }
304 
305     @Override
306     public void error(final String format, final Object arg1, final Object arg2) {
307         logger.logIfEnabled(FQCN, Level.ERROR, null, format, arg1, arg2);
308     }
309 
310     @Override
311     public void error(final String format, final Object... args) {
312         logger.logIfEnabled(FQCN, Level.ERROR, null, format, args);
313     }
314 
315     @Override
316     public void error(final String format, final Throwable t) {
317         logger.logIfEnabled(FQCN, Level.ERROR, null, format, t);
318     }
319 
320     @Override
321     public boolean isErrorEnabled() {
322         return logger.isEnabled(Level.ERROR, null, null);
323     }
324 
325     @Override
326     public boolean isErrorEnabled(final Marker marker) {
327         return logger.isEnabled(Level.ERROR, getMarker(marker), null);
328     }
329 
330     @Override
331     public void error(final Marker marker, final String s) {
332         logger.logIfEnabled(FQCN, Level.ERROR, getMarker(marker), s);
333     }
334 
335     @Override
336     public void error(final Marker marker, final String s, final Object o) {
337         logger.logIfEnabled(FQCN, Level.ERROR, getMarker(marker), s, o);
338     }
339 
340     @Override
341     public void error(final Marker marker, final String s, final Object o, final Object o1) {
342         logger.logIfEnabled(FQCN, Level.ERROR, getMarker(marker), s, o, o1);
343     }
344 
345     @Override
346     public void error(final Marker marker, final String s, final Object... objects) {
347         logger.logIfEnabled(FQCN, Level.ERROR, getMarker(marker), s, objects);
348     }
349 
350     @Override
351     public void error(final Marker marker, final String s, final Throwable throwable) {
352         logger.logIfEnabled(FQCN, Level.ERROR, getMarker(marker), s, throwable);
353     }
354 
355     @Override
356     public void log(final Marker marker, final String fqcn, final int level, final String message, final Object[] params, Throwable throwable) {
357         final Level log4jLevel = getLevel(level);
358         final org.apache.logging.log4j.Marker log4jMarker = getMarker(marker);
359 
360         if (!logger.isEnabled(log4jLevel, log4jMarker, message, params)) {
361             return;
362         }
363         final Message msg;
364         if (eventLogger && marker != null && marker.contains(EVENT_MARKER) && converter != null) {
365             msg = converter.convertEvent(message, params, throwable);
366         } else if (params == null) {
367             msg = new SimpleMessage(message);
368         } else {
369             msg = new ParameterizedMessage(message, params, throwable);
370             if (throwable != null) {
371                 throwable = msg.getThrowable();
372             }
373         }
374         logger.logMessage(fqcn, log4jLevel, log4jMarker, msg, throwable);
375     }
376 
377     private static org.apache.logging.log4j.Marker getMarker(final Marker marker) {
378         return marker != null ? ((org.apache.logging.slf4j.Log4jMarker) marker).getLog4jMarker() : null;
379     }
380 
381     @Override
382     public String getName() {
383         return name;
384     }
385 
386     /**
387      * Always treat de-serialization as a full-blown constructor, by validating the final state of
388      * the de-serialized object.
389      */
390     private void readObject(final ObjectInputStream aInputStream) throws ClassNotFoundException, IOException {
391         // always perform the default de-serialization first
392         aInputStream.defaultReadObject();
393         logger = LogManager.getContext().getLogger(name);
394         converter = createConverter();
395     }
396 
397     /**
398      * This is the default implementation of writeObject. Customise if necessary.
399      */
400     private void writeObject(final ObjectOutputStream aOutputStream) throws IOException {
401         // perform the default serialization for all non-transient, non-static fields
402         aOutputStream.defaultWriteObject();
403     }
404 
405     private static EventDataConverter createConverter() {
406         try {
407             Class.forName("org.slf4j.ext.EventData");
408             return new EventDataConverter();
409         } catch (final ClassNotFoundException cnfe) {
410             return null;
411         }
412     }
413 
414     private static Level getLevel(final int i) {
415         switch (i) {
416         case TRACE_INT:
417             return Level.TRACE;
418         case DEBUG_INT:
419             return Level.DEBUG;
420         case INFO_INT:
421             return Level.INFO;
422         case WARN_INT:
423             return Level.WARN;
424         case ERROR_INT:
425             return Level.ERROR;
426         }
427         return Level.ERROR;
428     }
429 }