1 /** 2 * Copyright (c) 2004-2011 QOS.ch 3 * All rights reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be 14 * included in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * 24 */ 25 package org.slf4j.helpers; 26 27 import java.lang.reflect.InvocationTargetException; 28 import java.lang.reflect.Method; 29 import java.util.Queue; 30 31 import org.slf4j.Logger; 32 import org.slf4j.Marker; 33 import org.slf4j.event.EventRecodingLogger; 34 import org.slf4j.event.LoggingEvent; 35 import org.slf4j.event.SubstituteLoggingEvent; 36 37 /** 38 * A logger implementation which logs via a delegate logger. By default, the delegate is a 39 * {@link NOPLogger}. However, a different delegate can be set at any time. 40 * <p/> 41 * See also the <a href="http://www.slf4j.org/codes.html#substituteLogger">relevant 42 * error code</a> documentation. 43 * 44 * @author Chetan Mehrotra 45 * @author Ceki Gulcu 46 */ 47 public class SubstituteLogger implements Logger { 48 49 private final String name; 50 private volatile Logger _delegate; 51 private Boolean delegateEventAware; 52 private Method logMethodCache; 53 private EventRecodingLogger eventRecodingLogger; 54 private Queue<SubstituteLoggingEvent> eventQueue; 55 56 private final boolean createdPostInitialization; 57 SubstituteLogger(String name, Queue<SubstituteLoggingEvent> eventQueue, boolean createdPostInitialization)58 public SubstituteLogger(String name, Queue<SubstituteLoggingEvent> eventQueue, boolean createdPostInitialization) { 59 this.name = name; 60 this.eventQueue = eventQueue; 61 this.createdPostInitialization = createdPostInitialization; 62 } 63 getName()64 public String getName() { 65 return name; 66 } 67 isTraceEnabled()68 public boolean isTraceEnabled() { 69 return delegate().isTraceEnabled(); 70 } 71 trace(String msg)72 public void trace(String msg) { 73 delegate().trace(msg); 74 } 75 trace(String format, Object arg)76 public void trace(String format, Object arg) { 77 delegate().trace(format, arg); 78 } 79 trace(String format, Object arg1, Object arg2)80 public void trace(String format, Object arg1, Object arg2) { 81 delegate().trace(format, arg1, arg2); 82 } 83 trace(String format, Object... arguments)84 public void trace(String format, Object... arguments) { 85 delegate().trace(format, arguments); 86 } 87 trace(String msg, Throwable t)88 public void trace(String msg, Throwable t) { 89 delegate().trace(msg, t); 90 } 91 isTraceEnabled(Marker marker)92 public boolean isTraceEnabled(Marker marker) { 93 return delegate().isTraceEnabled(marker); 94 } 95 trace(Marker marker, String msg)96 public void trace(Marker marker, String msg) { 97 delegate().trace(marker, msg); 98 } 99 trace(Marker marker, String format, Object arg)100 public void trace(Marker marker, String format, Object arg) { 101 delegate().trace(marker, format, arg); 102 } 103 trace(Marker marker, String format, Object arg1, Object arg2)104 public void trace(Marker marker, String format, Object arg1, Object arg2) { 105 delegate().trace(marker, format, arg1, arg2); 106 } 107 trace(Marker marker, String format, Object... arguments)108 public void trace(Marker marker, String format, Object... arguments) { 109 delegate().trace(marker, format, arguments); 110 } 111 trace(Marker marker, String msg, Throwable t)112 public void trace(Marker marker, String msg, Throwable t) { 113 delegate().trace(marker, msg, t); 114 } 115 isDebugEnabled()116 public boolean isDebugEnabled() { 117 return delegate().isDebugEnabled(); 118 } 119 debug(String msg)120 public void debug(String msg) { 121 delegate().debug(msg); 122 } 123 debug(String format, Object arg)124 public void debug(String format, Object arg) { 125 delegate().debug(format, arg); 126 } 127 debug(String format, Object arg1, Object arg2)128 public void debug(String format, Object arg1, Object arg2) { 129 delegate().debug(format, arg1, arg2); 130 } 131 debug(String format, Object... arguments)132 public void debug(String format, Object... arguments) { 133 delegate().debug(format, arguments); 134 } 135 debug(String msg, Throwable t)136 public void debug(String msg, Throwable t) { 137 delegate().debug(msg, t); 138 } 139 isDebugEnabled(Marker marker)140 public boolean isDebugEnabled(Marker marker) { 141 return delegate().isDebugEnabled(marker); 142 } 143 debug(Marker marker, String msg)144 public void debug(Marker marker, String msg) { 145 delegate().debug(marker, msg); 146 } 147 debug(Marker marker, String format, Object arg)148 public void debug(Marker marker, String format, Object arg) { 149 delegate().debug(marker, format, arg); 150 } 151 debug(Marker marker, String format, Object arg1, Object arg2)152 public void debug(Marker marker, String format, Object arg1, Object arg2) { 153 delegate().debug(marker, format, arg1, arg2); 154 } 155 debug(Marker marker, String format, Object... arguments)156 public void debug(Marker marker, String format, Object... arguments) { 157 delegate().debug(marker, format, arguments); 158 } 159 debug(Marker marker, String msg, Throwable t)160 public void debug(Marker marker, String msg, Throwable t) { 161 delegate().debug(marker, msg, t); 162 } 163 isInfoEnabled()164 public boolean isInfoEnabled() { 165 return delegate().isInfoEnabled(); 166 } 167 info(String msg)168 public void info(String msg) { 169 delegate().info(msg); 170 } 171 info(String format, Object arg)172 public void info(String format, Object arg) { 173 delegate().info(format, arg); 174 } 175 info(String format, Object arg1, Object arg2)176 public void info(String format, Object arg1, Object arg2) { 177 delegate().info(format, arg1, arg2); 178 } 179 info(String format, Object... arguments)180 public void info(String format, Object... arguments) { 181 delegate().info(format, arguments); 182 } 183 info(String msg, Throwable t)184 public void info(String msg, Throwable t) { 185 delegate().info(msg, t); 186 } 187 isInfoEnabled(Marker marker)188 public boolean isInfoEnabled(Marker marker) { 189 return delegate().isInfoEnabled(marker); 190 } 191 info(Marker marker, String msg)192 public void info(Marker marker, String msg) { 193 delegate().info(marker, msg); 194 } 195 info(Marker marker, String format, Object arg)196 public void info(Marker marker, String format, Object arg) { 197 delegate().info(marker, format, arg); 198 } 199 info(Marker marker, String format, Object arg1, Object arg2)200 public void info(Marker marker, String format, Object arg1, Object arg2) { 201 delegate().info(marker, format, arg1, arg2); 202 } 203 info(Marker marker, String format, Object... arguments)204 public void info(Marker marker, String format, Object... arguments) { 205 delegate().info(marker, format, arguments); 206 } 207 info(Marker marker, String msg, Throwable t)208 public void info(Marker marker, String msg, Throwable t) { 209 delegate().info(marker, msg, t); 210 } 211 isWarnEnabled()212 public boolean isWarnEnabled() { 213 return delegate().isWarnEnabled(); 214 } 215 warn(String msg)216 public void warn(String msg) { 217 delegate().warn(msg); 218 } 219 warn(String format, Object arg)220 public void warn(String format, Object arg) { 221 delegate().warn(format, arg); 222 } 223 warn(String format, Object arg1, Object arg2)224 public void warn(String format, Object arg1, Object arg2) { 225 delegate().warn(format, arg1, arg2); 226 } 227 warn(String format, Object... arguments)228 public void warn(String format, Object... arguments) { 229 delegate().warn(format, arguments); 230 } 231 warn(String msg, Throwable t)232 public void warn(String msg, Throwable t) { 233 delegate().warn(msg, t); 234 } 235 isWarnEnabled(Marker marker)236 public boolean isWarnEnabled(Marker marker) { 237 return delegate().isWarnEnabled(marker); 238 } 239 warn(Marker marker, String msg)240 public void warn(Marker marker, String msg) { 241 delegate().warn(marker, msg); 242 } 243 warn(Marker marker, String format, Object arg)244 public void warn(Marker marker, String format, Object arg) { 245 delegate().warn(marker, format, arg); 246 } 247 warn(Marker marker, String format, Object arg1, Object arg2)248 public void warn(Marker marker, String format, Object arg1, Object arg2) { 249 delegate().warn(marker, format, arg1, arg2); 250 } 251 warn(Marker marker, String format, Object... arguments)252 public void warn(Marker marker, String format, Object... arguments) { 253 delegate().warn(marker, format, arguments); 254 } 255 warn(Marker marker, String msg, Throwable t)256 public void warn(Marker marker, String msg, Throwable t) { 257 delegate().warn(marker, msg, t); 258 } 259 isErrorEnabled()260 public boolean isErrorEnabled() { 261 return delegate().isErrorEnabled(); 262 } 263 error(String msg)264 public void error(String msg) { 265 delegate().error(msg); 266 } 267 error(String format, Object arg)268 public void error(String format, Object arg) { 269 delegate().error(format, arg); 270 } 271 error(String format, Object arg1, Object arg2)272 public void error(String format, Object arg1, Object arg2) { 273 delegate().error(format, arg1, arg2); 274 } 275 error(String format, Object... arguments)276 public void error(String format, Object... arguments) { 277 delegate().error(format, arguments); 278 } 279 error(String msg, Throwable t)280 public void error(String msg, Throwable t) { 281 delegate().error(msg, t); 282 } 283 isErrorEnabled(Marker marker)284 public boolean isErrorEnabled(Marker marker) { 285 return delegate().isErrorEnabled(marker); 286 } 287 error(Marker marker, String msg)288 public void error(Marker marker, String msg) { 289 delegate().error(marker, msg); 290 } 291 error(Marker marker, String format, Object arg)292 public void error(Marker marker, String format, Object arg) { 293 delegate().error(marker, format, arg); 294 } 295 error(Marker marker, String format, Object arg1, Object arg2)296 public void error(Marker marker, String format, Object arg1, Object arg2) { 297 delegate().error(marker, format, arg1, arg2); 298 } 299 error(Marker marker, String format, Object... arguments)300 public void error(Marker marker, String format, Object... arguments) { 301 delegate().error(marker, format, arguments); 302 } 303 error(Marker marker, String msg, Throwable t)304 public void error(Marker marker, String msg, Throwable t) { 305 delegate().error(marker, msg, t); 306 } 307 308 @Override equals(Object o)309 public boolean equals(Object o) { 310 if (this == o) 311 return true; 312 if (o == null || getClass() != o.getClass()) 313 return false; 314 315 SubstituteLogger that = (SubstituteLogger) o; 316 317 if (!name.equals(that.name)) 318 return false; 319 320 return true; 321 } 322 323 @Override hashCode()324 public int hashCode() { 325 return name.hashCode(); 326 } 327 328 /** 329 * Return the delegate logger instance if set. Otherwise, return a {@link NOPLogger} 330 * instance. 331 */ delegate()332 Logger delegate() { 333 if(_delegate != null) { 334 return _delegate; 335 } 336 if(createdPostInitialization) { 337 return NOPLogger.NOP_LOGGER; 338 } else { 339 return getEventRecordingLogger(); 340 } 341 } 342 getEventRecordingLogger()343 private Logger getEventRecordingLogger() { 344 if (eventRecodingLogger == null) { 345 eventRecodingLogger = new EventRecodingLogger(this, eventQueue); 346 } 347 return eventRecodingLogger; 348 } 349 350 /** 351 * Typically called after the {@link org.slf4j.LoggerFactory} initialization phase is completed. 352 * @param delegate 353 */ setDelegate(Logger delegate)354 public void setDelegate(Logger delegate) { 355 this._delegate = delegate; 356 } 357 isDelegateEventAware()358 public boolean isDelegateEventAware() { 359 if (delegateEventAware != null) 360 return delegateEventAware; 361 362 try { 363 logMethodCache = _delegate.getClass().getMethod("log", LoggingEvent.class); 364 delegateEventAware = Boolean.TRUE; 365 } catch (NoSuchMethodException e) { 366 delegateEventAware = Boolean.FALSE; 367 } 368 return delegateEventAware; 369 } 370 log(LoggingEvent event)371 public void log(LoggingEvent event) { 372 if (isDelegateEventAware()) { 373 try { 374 logMethodCache.invoke(_delegate, event); 375 } catch (IllegalAccessException e) { 376 } catch (IllegalArgumentException e) { 377 } catch (InvocationTargetException e) { 378 } 379 } 380 } 381 382 isDelegateNull()383 public boolean isDelegateNull() { 384 return _delegate == null; 385 } 386 isDelegateNOP()387 public boolean isDelegateNOP() { 388 return _delegate instanceof NOPLogger; 389 } 390 } 391