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}