/* * Copyright (c) 2009 Red Hat, 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 * * 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. */ package io.vertx.core.logging; import io.vertx.core.spi.logging.LogDelegate; import io.vertx.core.spi.logging.LogDelegateFactory; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * @author <a href="http://tfox.org">Tim Fox</a> */ public class LoggerFactory { public static final String LOGGER_DELEGATE_FACTORY_CLASS_NAME = "vertx.logger-delegate-factory-class-name"; private static volatile LogDelegateFactory delegateFactory; private static final ConcurrentMap<String, Logger> loggers = new ConcurrentHashMap<>(); static { initialise(); } public static synchronized void initialise() { LogDelegateFactory delegateFactory; // If a system property is specified then this overrides any delegate factory which is set // programmatically - this is primarily of use so we can configure the logger delegate on the client side. // call to System.getProperty is wrapped in a try block as it will fail if the client runs in a secured // environment String className = JULLogDelegateFactory.class.getName(); try { className = System.getProperty(LOGGER_DELEGATE_FACTORY_CLASS_NAME); } catch (Exception e) { } if (className != null) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { Class<?> clz = loader.loadClass(className); delegateFactory = (LogDelegateFactory) clz.newInstance(); } catch (Exception e) { throw new IllegalArgumentException("Error instantiating transformer class \"" + className + "\"", e); } } else { delegateFactory = new JULLogDelegateFactory(); } LoggerFactory.delegateFactory = delegateFactory; } public static Logger getLogger(final Class<?> clazz) { String name = clazz.isAnonymousClass() ? clazz.getEnclosingClass().getCanonicalName() : clazz.getCanonicalName(); return getLogger(name); } public static Logger getLogger(final String name) { Logger logger = loggers.get(name); if (logger == null) { LogDelegate delegate = delegateFactory.createDelegate(name); logger = new Logger(delegate); Logger oldLogger = loggers.putIfAbsent(name, logger); if (oldLogger != null) { logger = oldLogger; } } return logger; } public static void removeLogger(String name) { loggers.remove(name); } }