/*
* Copyright 2010 Outerthought bvba
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lilyproject.hadooptestfw;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
/**
* Redirects Java logging to log4j.
*
* <p>This code comes from http://wiki.apache.org/myfaces/Trinidad_and_Common_Logging
* but slightly adapted to log4j instead of commons-logging.
*
* <p>It would actually be better to redirect to commons-logging, but the Solr war
* which is launched as part of certain test cases contains the jcl-slf4j bridge and
* uses jdk14-slf4j, which would cause endless loops between logging systems.
*/
public class JavaLoggingToLog4jRedirector {
static JDKLogHandler activeHandler;
private JavaLoggingToLog4jRedirector() {
}
/**
* Activates this feature.
*/
public static void activate() {
try {
Logger rootLogger = LogManager.getLogManager().getLogger("");
// remove old handlers
for (Handler handler : rootLogger.getHandlers()) {
rootLogger.removeHandler(handler);
}
// add our own
activeHandler = new JDKLogHandler();
activeHandler.setLevel(Level.ALL);
rootLogger.addHandler(activeHandler);
rootLogger.setLevel(Level.ALL);
// done, let's check it right away!!!
Logger.getLogger(JavaLoggingToLog4jRedirector.class.getName()).info("activated: sending JDK log messages to Commons Logging");
} catch (Exception exc) {
org.apache.log4j.Logger.getLogger(JavaLoggingToLog4jRedirector.class).error("activation failed", exc);
}
}
public static void deactivate() {
Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.removeHandler(activeHandler);
Logger.getLogger(JavaLoggingToLog4jRedirector.class.getName()).info("dactivated");
}
protected static class JDKLogHandler extends Handler {
private Map<String, org.apache.log4j.Logger> cachedLogs = new ConcurrentHashMap<String, org.apache.log4j.Logger>();
private org.apache.log4j.Logger getLog(String logName) {
org.apache.log4j.Logger log = cachedLogs.get(logName);
if (log == null) {
log = org.apache.log4j.Logger.getLogger(logName);
cachedLogs.put(logName, log);
}
return log;
}
@Override
public void publish(LogRecord record) {
org.apache.log4j.Logger logger = getLog(record.getLoggerName());
String message = record.getMessage();
Throwable exception = record.getThrown();
Level level = record.getLevel();
if (level == Level.SEVERE) {
logger.error(message, exception);
} else if (level == Level.WARNING) {
logger.warn(message, exception);
} else if (level == Level.INFO) {
logger.info(message, exception);
} else if (level == Level.CONFIG) {
logger.debug(message, exception);
} else {
logger.trace(message, exception);
}
}
@Override
public void flush() {
// nothing to do
}
@Override
public void close() {
// nothing to do
}
}
}