org.eclipse.gemini.blueprint.util.LogUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gemini.blueprint.util.LogUtils.java

Source

/******************************************************************************
 * 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;
    }
}