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     */
017    package org.slf4j.impl;
018    
019    import org.apache.logging.log4j.Level;
020    import org.apache.logging.log4j.message.Message;
021    import org.apache.logging.log4j.message.ParameterizedMessage;
022    import org.apache.logging.log4j.message.SimpleMessage;
023    import org.apache.logging.log4j.message.StructuredDataMessage;
024    import org.apache.logging.log4j.spi.AbstractLogger;
025    import org.apache.logging.log4j.spi.AbstractLoggerWrapper;
026    import org.slf4j.Marker;
027    import org.slf4j.MarkerFactory;
028    import org.slf4j.ext.EventData;
029    import org.slf4j.spi.LocationAwareLogger;
030    
031    import java.util.Map;
032    
033    /**
034     *
035     */
036    public class SLF4JLogger implements LocationAwareLogger {
037    
038        private static final String FQCN = SLF4JLogger.class.getName();
039        private static final Marker EVENT_MARKER = MarkerFactory.getMarker("EVENT");
040        private final boolean eventLogger;
041        private final AbstractLoggerWrapper logger;
042        private final String name;
043    
044        public SLF4JLogger(final AbstractLogger logger, final String name) {
045            this.logger = new AbstractLoggerWrapper(logger, name, null);
046            eventLogger = "EventLogger".equals(name);
047            this.name = name;
048        }
049    
050        @Override
051        public void trace(final String format) {
052            if (logger.isTraceEnabled()) {
053                logger.log(null, FQCN, Level.TRACE, new SimpleMessage(format), null);
054            }
055        }
056    
057        @Override
058        public void trace(final String format, final Object o) {
059            if (logger.isTraceEnabled()) {
060                logger.log(null, FQCN, Level.TRACE, new ParameterizedMessage(format, o), null);
061            }
062        }
063    
064        @Override
065        public void trace(final String format, final Object arg1, final Object arg2) {
066            if (logger.isTraceEnabled()) {
067                final ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);
068                logger.log(null, FQCN, Level.TRACE, msg, msg.getThrowable());
069            }
070        }
071    
072        @Override
073        public void trace(final String format, final Object... args) {
074            if (logger.isTraceEnabled()) {
075                final ParameterizedMessage msg = new ParameterizedMessage(format, args);
076                logger.log(null, FQCN, Level.TRACE, msg, msg.getThrowable());
077            }
078        }
079    
080        @Override
081        public void trace(final String format, final Throwable t) {
082            if (logger.isTraceEnabled()) {
083                logger.log(null, FQCN, Level.TRACE, new SimpleMessage(format), t);
084            }
085        }
086    
087        @Override
088        public boolean isTraceEnabled() {
089            return logger.isTraceEnabled();
090        }
091    
092        @Override
093        public boolean isTraceEnabled(final Marker marker) {
094            return logger.isTraceEnabled((org.apache.logging.log4j.Marker) marker);
095        }
096    
097        @Override
098        public void trace(final Marker marker, final String s) {
099            if (isTraceEnabled(marker)) {
100                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, new SimpleMessage(s), null);
101            }
102        }
103    
104        @Override
105        public void trace(final Marker marker, final String s, final Object o) {
106            if (isTraceEnabled(marker)) {
107                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,
108                    new ParameterizedMessage(s, o), null);
109            }
110        }
111    
112        @Override
113        public void trace(final Marker marker, final String s, final Object o, final Object o1) {
114            if (isTraceEnabled(marker)) {
115                final ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);
116                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, msg, msg.getThrowable());
117            }
118        }
119    
120        @Override
121        public void trace(final Marker marker, final String s, final Object... objects) {
122            if (isTraceEnabled(marker)) {
123                final ParameterizedMessage msg = new ParameterizedMessage(s, objects);
124                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, msg, msg.getThrowable());
125            }
126        }
127    
128        @Override
129        public void trace(final Marker marker, final String s, final Throwable throwable) {
130            if (isTraceEnabled(marker)) {
131                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,
132                    new SimpleMessage(s), throwable);
133            }
134        }
135    
136        @Override
137        public void debug(final String format) {
138            if (logger.isDebugEnabled()) {
139                logger.log(null, FQCN, Level.DEBUG, new SimpleMessage(format), null);
140            }
141        }
142    
143        @Override
144        public void debug(final String format, final Object o) {
145            if (logger.isDebugEnabled()) {
146                logger.log(null, FQCN, Level.DEBUG, new ParameterizedMessage(format, o), null);
147            }
148        }
149    
150        @Override
151        public void debug(final String format, final Object arg1, final Object arg2) {
152            if (logger.isDebugEnabled()) {
153                final ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);
154                logger.log(null, FQCN, Level.DEBUG, msg, msg.getThrowable());
155            }
156        }
157    
158        @Override
159        public void debug(final String format, final Object... args) {
160            if (logger.isDebugEnabled()) {
161                final ParameterizedMessage msg = new ParameterizedMessage(format, args);
162                logger.log(null, FQCN, Level.DEBUG, msg, msg.getThrowable());
163            }
164        }
165    
166        @Override
167        public void debug(final String format, final Throwable t) {
168            if (logger.isDebugEnabled()) {
169                logger.log(null, FQCN, Level.DEBUG, new SimpleMessage(format), t);
170            }
171        }
172    
173        @Override
174        public boolean isDebugEnabled() {
175            return logger.isDebugEnabled();
176        }
177    
178        @Override
179        public boolean isDebugEnabled(final Marker marker) {
180            return logger.isDebugEnabled((org.apache.logging.log4j.Marker) marker);
181        }
182    
183        @Override
184        public void debug(final Marker marker, final String s) {
185            if (isDebugEnabled(marker)) {
186                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, new SimpleMessage(s), null);
187            }
188        }
189    
190        @Override
191        public void debug(final Marker marker, final String s, final Object o) {
192            if (isDebugEnabled(marker)) {
193                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,
194                    new ParameterizedMessage(s, o), null);
195            }
196        }
197    
198        @Override
199        public void debug(final Marker marker, final String s, final Object o, final Object o1) {
200            if (isDebugEnabled(marker)) {
201                final ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);
202                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, msg, msg.getThrowable());
203            }
204        }
205    
206        @Override
207        public void debug(final Marker marker, final String s, final Object... objects) {
208            if (isDebugEnabled(marker)) {
209                final ParameterizedMessage msg = new ParameterizedMessage(s, objects);
210                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, msg, msg.getThrowable());
211            }
212        }
213    
214        @Override
215        public void debug(final Marker marker, final String s, final Throwable throwable) {
216            if (isDebugEnabled(marker)) {
217                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,
218                    new SimpleMessage(s), throwable);
219            }
220        }
221    
222        @Override
223        public void info(final String format) {
224            if (logger.isInfoEnabled()) {
225                logger.log(null, FQCN, Level.INFO, new SimpleMessage(format), null);
226            }
227        }
228    
229        @Override
230        public void info(final String format, final Object o) {
231            if (logger.isInfoEnabled()) {
232                logger.log(null, FQCN, Level.INFO, new ParameterizedMessage(format, o), null);
233            }
234        }
235    
236        @Override
237        public void info(final String format, final Object arg1, final Object arg2) {
238            if (logger.isInfoEnabled()) {
239                final ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);
240                logger.log(null, FQCN, Level.INFO, msg, msg.getThrowable());
241            }
242        }
243    
244        @Override
245        public void info(final String format, final Object... args) {
246            if (logger.isInfoEnabled()) {
247                final ParameterizedMessage msg = new ParameterizedMessage(format, args);
248                logger.log(null, FQCN, Level.INFO, msg, msg.getThrowable());
249            }
250        }
251    
252        @Override
253        public void info(final String format, final Throwable t) {
254            if (logger.isInfoEnabled()) {
255                logger.log(null, FQCN, Level.INFO, new SimpleMessage(format), t);
256            }
257        }
258    
259        @Override
260        public boolean isInfoEnabled() {
261            return logger.isInfoEnabled();
262        }
263    
264        @Override
265        public boolean isInfoEnabled(final Marker marker) {
266            return logger.isInfoEnabled((org.apache.logging.log4j.Marker) marker);
267        }
268    
269        @Override
270        public void info(final Marker marker, final String s) {
271            if (isInfoEnabled(marker)) {
272                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, new SimpleMessage(s), null);
273            }
274        }
275    
276        @Override
277        public void info(final Marker marker, final String s, final Object o) {
278            if (isInfoEnabled(marker)) {
279                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,
280                    new ParameterizedMessage(s, o), null);
281            }
282        }
283    
284        @Override
285        public void info(final Marker marker, final String s, final Object o, final Object o1) {
286            if (isInfoEnabled(marker)) {
287                final ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);
288                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, msg, msg.getThrowable());
289            }
290        }
291    
292        @Override
293        public void info(final Marker marker, final String s, final Object... objects) {
294            if (isInfoEnabled(marker)) {
295                final ParameterizedMessage msg = new ParameterizedMessage(s, objects);
296                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, msg, msg.getThrowable());
297            }
298        }
299    
300        @Override
301        public void info(final Marker marker, final String s, final Throwable throwable) {
302            if (isInfoEnabled(marker)) {
303                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,
304                    new SimpleMessage(s), throwable);
305            }
306        }
307    
308        @Override
309        public void warn(final String format) {
310            if (logger.isWarnEnabled()) {
311                logger.log(null, FQCN, Level.WARN, new SimpleMessage(format), null);
312            }
313        }
314    
315        @Override
316        public void warn(final String format, final Object o) {
317            if (logger.isWarnEnabled()) {
318                logger.log(null, FQCN, Level.WARN, new ParameterizedMessage(format, o), null);
319            }
320        }
321    
322        @Override
323        public void warn(final String format, final Object arg1, final Object arg2) {
324            if (logger.isWarnEnabled()) {
325                final ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);
326                logger.log(null, FQCN, Level.WARN, msg, msg.getThrowable());
327            }
328        }
329    
330        @Override
331        public void warn(final String format, final Object... args) {
332            if (logger.isWarnEnabled()) {
333                final ParameterizedMessage msg = new ParameterizedMessage(format, args);
334                logger.log(null, FQCN, Level.WARN, msg, msg.getThrowable());
335            }
336        }
337    
338        @Override
339        public void warn(final String format, final Throwable t) {
340            if (logger.isWarnEnabled()) {
341                logger.log(null, FQCN, Level.WARN, new SimpleMessage(format), t);
342            }
343        }
344    
345        @Override
346        public boolean isWarnEnabled() {
347            return logger.isWarnEnabled();
348        }
349    
350        @Override
351        public boolean isWarnEnabled(final Marker marker) {
352            return logger.isWarnEnabled((org.apache.logging.log4j.Marker) marker);
353        }
354    
355        @Override
356        public void warn(final Marker marker, final String s) {
357            if (isWarnEnabled(marker)) {
358                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, new SimpleMessage(s), null);
359            }
360        }
361    
362        @Override
363        public void warn(final Marker marker, final String s, final Object o) {
364            if (isWarnEnabled(marker)) {
365                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,
366                    new ParameterizedMessage(s, o), null);
367            }
368        }
369    
370        @Override
371        public void warn(final Marker marker, final String s, final Object o, final Object o1) {
372            if (isWarnEnabled(marker)) {
373                final ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);
374                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, msg, msg.getThrowable());
375            }
376        }
377    
378        @Override
379        public void warn(final Marker marker, final String s, final Object... objects) {
380            if (isWarnEnabled(marker)) {
381                final ParameterizedMessage msg = new ParameterizedMessage(s, objects);
382                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, msg, msg.getThrowable());
383            }
384        }
385    
386        @Override
387        public void warn(final Marker marker, final String s, final Throwable throwable) {
388            if (isWarnEnabled(marker)) {
389                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,
390                    new SimpleMessage(s), throwable);
391            }
392        }
393    
394        @Override
395        public void error(final String format) {
396            if (logger.isErrorEnabled()) {
397                logger.log(null, FQCN, Level.ERROR, new SimpleMessage(format), null);
398            }
399        }
400    
401        @Override
402        public void error(final String format, final Object o) {
403            if (logger.isErrorEnabled()) {
404                logger.log(null, FQCN, Level.ERROR, new ParameterizedMessage(format, o), null);
405            }
406        }
407    
408        @Override
409        public void error(final String format, final Object arg1, final Object arg2) {
410            if (logger.isErrorEnabled()) {
411                final ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);
412                logger.log(null, FQCN, Level.ERROR, msg, msg.getThrowable());
413            }
414        }
415    
416        @Override
417        public void error(final String format, final Object... args) {
418            if (logger.isErrorEnabled()) {
419                final ParameterizedMessage msg = new ParameterizedMessage(format, args);
420                logger.log(null, FQCN, Level.ERROR, msg, msg.getThrowable());
421            }
422        }
423    
424        @Override
425        public void error(final String format, final Throwable t) {
426            if (logger.isErrorEnabled()) {
427                logger.log(null, FQCN, Level.ERROR, new SimpleMessage(format), t);
428            }
429        }
430    
431        @Override
432        public boolean isErrorEnabled() {
433            return logger.isErrorEnabled();
434        }
435    
436        @Override
437        public boolean isErrorEnabled(final Marker marker) {
438            return logger.isErrorEnabled((org.apache.logging.log4j.Marker) marker);
439        }
440    
441        @Override
442        public void error(final Marker marker, final String s) {
443            if (isErrorEnabled(marker)) {
444                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, new SimpleMessage(s), null);
445            }
446        }
447    
448        @Override
449        public void error(final Marker marker, final String s, final Object o) {
450            if (isErrorEnabled(marker)) {
451                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,
452                    new ParameterizedMessage(s, o), null);
453            }
454        }
455    
456        @Override
457        public void error(final Marker marker, final String s, final Object o, final Object o1) {
458            if (isErrorEnabled(marker)) {
459                final ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);
460                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, msg, msg.getThrowable());
461            }
462        }
463    
464        @Override
465        public void error(final Marker marker, final String s, final Object... objects) {
466            if (isErrorEnabled(marker)) {
467                final ParameterizedMessage msg = new ParameterizedMessage(s, objects);
468                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, msg, msg.getThrowable());
469            }
470        }
471    
472        @Override
473        public void error(final Marker marker, final String s, final Throwable throwable) {
474            if (isErrorEnabled(marker)) {
475                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,
476                    new SimpleMessage(s), throwable);
477            }
478        }
479    
480    
481        @Override
482        public void log(final Marker marker, final String fqcn, final int i, final String s1, final Object[] objects,
483                        Throwable throwable) {
484            if (!logger.isEnabled(getLevel(i), (org.apache.logging.log4j.Marker) marker, s1)) {
485                return;
486            }
487            Message msg;
488            if (eventLogger && marker != null && marker.contains(EVENT_MARKER)) {
489                try {
490                    final EventData data = (objects != null && objects[0] instanceof EventData) ? (EventData) objects[0] :
491                        new EventData(s1);
492                    msg = new StructuredDataMessage(data.getEventId(), data.getMessage(), data.getEventType());
493                    for (final Map.Entry entry : data.getEventMap().entrySet()) {
494                        final String key = entry.getKey().toString();
495                        if (EventData.EVENT_TYPE.equals(key) || EventData.EVENT_ID.equals(key) ||
496                            EventData.EVENT_MESSAGE.equals(key)) {
497                            continue;
498                        }
499                        ((StructuredDataMessage) msg).put(entry.getKey().toString(), entry.getValue().toString());
500                    }
501                } catch (final Exception ex) {
502                    msg = new ParameterizedMessage(s1, objects, throwable);
503                }
504    
505           } else if (objects == null) {
506                msg = new SimpleMessage(s1);
507            } else {
508                msg = new ParameterizedMessage(s1, objects, throwable);
509                if (throwable != null) {
510                    throwable = msg.getThrowable();
511                }
512            }
513            logger.log((org.apache.logging.log4j.Marker) marker, fqcn, getLevel(i), msg, throwable);
514        }
515    
516        @Override
517        public String getName() {
518            return name;
519        }
520    
521        private Level getLevel(final int i) {
522    
523            switch (i) {
524                case TRACE_INT :
525                    return Level.TRACE;
526                case DEBUG_INT :
527                    return Level.DEBUG;
528                case INFO_INT :
529                    return Level.INFO;
530                case WARN_INT :
531                    return Level.WARN;
532                case ERROR_INT :
533                    return Level.ERROR;
534            }
535            return Level.ERROR;
536        }
537    }