Skip to content

Commit

Permalink
Merge pull request #58 from chetanmeh/SLF4J-311
Browse files Browse the repository at this point in the history
SLF4j 311 - Enable swapping of NOPLogger in SubstituteLoggerFactory
  • Loading branch information
ceki committed Feb 3, 2014
2 parents 212e289 + c529cbd commit 8b3cc12
Show file tree
Hide file tree
Showing 6 changed files with 541 additions and 39 deletions.
25 changes: 16 additions & 9 deletions slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
Expand Up @@ -29,6 +29,7 @@
import java.util.*;

import org.slf4j.helpers.NOPLoggerFactory;
import org.slf4j.helpers.SubstitutableLogger;
import org.slf4j.helpers.SubstituteLoggerFactory;
import org.slf4j.helpers.Util;
import org.slf4j.impl.StaticLoggerBinder;
Expand Down Expand Up @@ -128,7 +129,7 @@ private final static void bind() {
StaticLoggerBinder.getSingleton();
INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
reportActualBinding(staticLoggerBinderPathSet);
emitSubstituteLoggerWarning();
fixSubstitutedLoggers();
} catch (NoClassDefFoundError ncde) {
String msg = ncde.getMessage();
if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {
Expand Down Expand Up @@ -161,18 +162,24 @@ static void failedBinding(Throwable t) {
Util.report("Failed to instantiate SLF4J LoggerFactory", t);
}

private final static void emitSubstituteLoggerWarning() {
List loggerNameList = TEMP_FACTORY.getLoggerNameList();
if (loggerNameList.size() == 0) {
private final static void fixSubstitutedLoggers() {
List<SubstitutableLogger> loggers = TEMP_FACTORY.getLoggers();

if(loggers.isEmpty()){
return;
}
Util.report("The following loggers will not work because they were created");
Util.report("during the default configuration phase of the underlying logging system.");

Util.report("The following set of substitute loggers may have been accessed");
Util.report("during the initialization phase and logging calls during this");
Util.report("phase were not honored but that calls in the future to these loggers");
Util.report("will be honored.");
Util.report("See also " + SUBSTITUTE_LOGGER_URL);
for (int i = 0; i < loggerNameList.size(); i++) {
String loggerName = (String) loggerNameList.get(i);
Util.report(loggerName);
for(SubstitutableLogger subLogger : loggers){
subLogger.setDelegate(getLogger(subLogger.getName()));
Util.report(subLogger.getName());
}

TEMP_FACTORY.clear();
}

private final static void versionSanityCheck() {
Expand Down
314 changes: 314 additions & 0 deletions slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java
@@ -0,0 +1,314 @@
/**
* Copyright (c) 2004-2011 QOS.ch
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package org.slf4j.helpers;

import org.slf4j.Logger;
import org.slf4j.Marker;

/**
* A helper class which delegates all calls to different Loggers. This enables
* swapping of the Logger implementation later.
*
* @author Chetan Mehrotra
*/
public class SubstitutableLogger implements Logger {

private final String name;

private volatile Logger _delegate;

public SubstitutableLogger(String name) {
this.name = name;
}

public String getName() {
return name;
}

public boolean isTraceEnabled() {
return delegate().isTraceEnabled();
}

public void trace(String msg) {
delegate().trace(msg);
}

public void trace(String format, Object arg) {
delegate().trace(format, arg);
}

public void trace(String format, Object arg1, Object arg2) {
delegate().trace(format, arg1, arg2);
}

public void trace(String format, Object... arguments) {
delegate().trace(format, arguments);
}

public void trace(String msg, Throwable t) {
delegate().trace(msg, t);
}

public boolean isTraceEnabled(Marker marker) {
return delegate().isTraceEnabled(marker);
}

public void trace(Marker marker, String msg) {
delegate().trace(marker, msg);
}

public void trace(Marker marker, String format, Object arg) {
delegate().trace(marker, format, arg);
}

public void trace(Marker marker, String format, Object arg1, Object arg2) {
delegate().trace(marker, format, arg1, arg2);
}

public void trace(Marker marker, String format, Object... arguments) {
delegate().trace(marker, format, arguments);
}

public void trace(Marker marker, String msg, Throwable t) {
delegate().trace(marker, msg, t);
}

public boolean isDebugEnabled() {
return delegate().isDebugEnabled();
}

public void debug(String msg) {
delegate().debug(msg);
}

public void debug(String format, Object arg) {
delegate().debug(format, arg);
}

public void debug(String format, Object arg1, Object arg2) {
delegate().debug(format, arg1, arg2);
}

public void debug(String format, Object... arguments) {
delegate().debug(format, arguments);
}

public void debug(String msg, Throwable t) {
delegate().debug(msg, t);
}

public boolean isDebugEnabled(Marker marker) {
return delegate().isDebugEnabled(marker);
}

public void debug(Marker marker, String msg) {
delegate().debug(marker, msg);
}

public void debug(Marker marker, String format, Object arg) {
delegate().debug(marker, format, arg);
}

public void debug(Marker marker, String format, Object arg1, Object arg2) {
delegate().debug(marker, format, arg1, arg2);
}

public void debug(Marker marker, String format, Object... arguments) {
delegate().debug(marker, format, arguments);
}

public void debug(Marker marker, String msg, Throwable t) {
delegate().debug(marker, msg, t);
}

public boolean isInfoEnabled() {
return delegate().isInfoEnabled();
}

public void info(String msg) {
delegate().info(msg);
}

public void info(String format, Object arg) {
delegate().info(format, arg);
}

public void info(String format, Object arg1, Object arg2) {
delegate().info(format, arg1, arg2);
}

public void info(String format, Object... arguments) {
delegate().info(format, arguments);
}

public void info(String msg, Throwable t) {
delegate().info(msg, t);
}

public boolean isInfoEnabled(Marker marker) {
return delegate().isInfoEnabled(marker);
}

public void info(Marker marker, String msg) {
delegate().info(marker, msg);
}

public void info(Marker marker, String format, Object arg) {
delegate().info(marker, format, arg);
}

public void info(Marker marker, String format, Object arg1, Object arg2) {
delegate().info(marker, format, arg1, arg2);
}

public void info(Marker marker, String format, Object... arguments) {
delegate().info(marker, format, arguments);
}

public void info(Marker marker, String msg, Throwable t) {
delegate().info(marker, msg, t);
}

public boolean isWarnEnabled() {
return delegate().isWarnEnabled();
}

public void warn(String msg) {
delegate().warn(msg);
}

public void warn(String format, Object arg) {
delegate().warn(format, arg);
}

public void warn(String format, Object arg1, Object arg2) {
delegate().warn(format, arg1, arg2);
}

public void warn(String format, Object... arguments) {
delegate().warn(format, arguments);
}

public void warn(String msg, Throwable t) {
delegate().warn(msg, t);
}

public boolean isWarnEnabled(Marker marker) {
return delegate().isWarnEnabled(marker);
}

public void warn(Marker marker, String msg) {
delegate().warn(marker, msg);
}

public void warn(Marker marker, String format, Object arg) {
delegate().warn(marker, format, arg);
}

public void warn(Marker marker, String format, Object arg1, Object arg2) {
delegate().warn(marker, format, arg1, arg2);
}

public void warn(Marker marker, String format, Object... arguments) {
delegate().warn(marker, format, arguments);
}

public void warn(Marker marker, String msg, Throwable t) {
delegate().warn(marker, msg, t);
}

public boolean isErrorEnabled() {
return delegate().isErrorEnabled();
}

public void error(String msg) {
delegate().error(msg);
}

public void error(String format, Object arg) {
delegate().error(format, arg);
}

public void error(String format, Object arg1, Object arg2) {
delegate().error(format, arg1, arg2);
}

public void error(String format, Object... arguments) {
delegate().error(format, arguments);
}

public void error(String msg, Throwable t) {
delegate().error(msg, t);
}

public boolean isErrorEnabled(Marker marker) {
return delegate().isErrorEnabled(marker);
}

public void error(Marker marker, String msg) {
delegate().error(marker, msg);
}

public void error(Marker marker, String format, Object arg) {
delegate().error(marker, format, arg);
}

public void error(Marker marker, String format, Object arg1, Object arg2) {
delegate().error(marker, format, arg1, arg2);
}

public void error(Marker marker, String format, Object... arguments) {
delegate().error(marker, format, arguments);
}

public void error(Marker marker, String msg, Throwable t) {
delegate().error(marker, msg, t);
}

public void setDelegate(Logger delegate) {
this._delegate = delegate;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

SubstitutableLogger that = (SubstitutableLogger) o;

if (!name.equals(that.name)) return false;

return true;
}

@Override
public int hashCode() {
return name.hashCode();
}

Logger delegate() {
return _delegate != null ? _delegate : NOPLogger.NOP_LOGGER;
}
}

0 comments on commit 8b3cc12

Please sign in to comment.