/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.util; import java.security.AccessController; import java.security.PrivilegedAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Utility class used for creating 'degradable' loggers for critical parts of the applications. In the future, this * class might be used across the entire product. * * @author Costin Leau * */ class LogUtils { /** * Set the TCCL of the bundle before creating the logger. This helps if commons-logging is used since it looks at * the existing TCCL before associating a LogFactory with it and since the TCCL can be the * BundleDelegatingClassLoader, loading a LogFactory using the BundleDelegatingClassLoader will result in an * infinite cycle or chained failures that would be swallowed. * * <p/> Create the logger using LogFactory but use a simple implementation if something goes wrong. * * @param logName log name * @return logger implementation */ public static Log createLogger(final Class<?> logName) { if (System.getSecurityManager() != null) { return AccessController.doPrivileged(new PrivilegedAction<Log>() { public Log run() { return doCreateLogger(logName); } }); } return doCreateLogger(logName); } private static Log doCreateLogger(Class<?> logName) { Log logger; ClassLoader ccl = Thread.currentThread().getContextClassLoader(); // push the logger class classloader (useful when dealing with commons-logging 1.0.x Thread.currentThread().setContextClassLoader(logName.getClassLoader()); try { logger = LogFactory.getLog(logName); } catch (Throwable th) { logger = new SimpleLogger(); logger .fatal( "logger infrastructure not properly set up. If commons-logging jar is used try switching to slf4j (see the FAQ for more info).", th); } finally { Thread.currentThread().setContextClassLoader(ccl); } return logger; } }