package alma.acs.logging.adapters;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import alma.acs.logging.AcsLogger;
/**
* We intercept the log4j logs at the first level, the Logger itself.
* It may have been good enough to inject the ACS logger as a log4j appender,
* but it seems that only the Logger allows us to implement <code>isDebugEnabled</code>
* type of methods based on the ACS-configured log levels,
* rather than first creating and later dropping a LoggingEvent object.
*/
public class Log4jLogger extends org.apache.log4j.Logger
{
private final AcsLogger delegate;
/**
*
*/
public Log4jLogger(String name, AcsLogger delegate) {
super(name);
this.delegate = delegate;
delegate.addLoggerClass(Log4jLogger.class);
// System.out.println("*** Created Log4jAcsLogger ***");
}
@Override
public boolean isTraceEnabled() {
return delegate.isLoggable(log4jLevelToJdkLevel(Level.TRACE));
}
@Override
public boolean isDebugEnabled() {
return delegate.isLoggable(log4jLevelToJdkLevel(Level.DEBUG));
}
@Override
public boolean isInfoEnabled() {
return delegate.isLoggable(log4jLevelToJdkLevel(Level.INFO));
}
@Override
protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
// System.out.println("*** Log4jAcsLogger intercepted a log: " + message + " ***");
delegate.log(log4jLevelToJdkLevel(level), message.toString(), t);
}
java.util.logging.Level log4jLevelToJdkLevel(Priority level) {
switch (level.toInt()) {
case Level.TRACE_INT:
return java.util.logging.Level.FINEST;
case Level.DEBUG_INT:
return java.util.logging.Level.FINER; // or FINE ?
case Level.INFO_INT:
return java.util.logging.Level.INFO;
case Level.FATAL_INT:
return java.util.logging.Level.SEVERE;
case Level.WARN_INT:
case Level.ERROR_INT:
default:
return java.util.logging.Level.WARNING;
}
}
}