/* * @(#)LoggerFactory.java 2013-1-21 下午3:08:43 * * Copyright (c) 2011-2013 Makersoft.org all rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * */ package org.makersoft.log; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.makersoft.log.sl4j.Sl4jLoggerFactory; /** * Creates loggers. Static accessor will lazily try to decide on the best factory if none specified. */ public abstract class LoggerFactory { private static final ReadWriteLock lock = new ReentrantReadWriteLock(); private static LoggerFactory factory; public static void setLoggerFactory(LoggerFactory factory) { lock.writeLock().lock(); try { LoggerFactory.factory = factory; } finally { lock.writeLock().unlock(); } } public static Log getLogger(Class<?> cls) { return getLoggerFactory().getLoggerImpl(cls); } public static Log getLogger(String name) { return getLoggerFactory().getLoggerImpl(name); } protected static LoggerFactory getLoggerFactory() { lock.readLock().lock(); try { if (factory != null) { return factory; } } finally { lock.readLock().unlock(); } lock.writeLock().lock(); try { if (factory == null) { try { // Class.forName("org.apache.commons.logging.LogFactory"); // factory = new CommonsLoggerFactory(); Class.forName("org.slf4j.LoggerFactory"); factory = new Sl4jLoggerFactory(); } catch (ClassNotFoundException ex) { // commons logging not found, falling back to jdk logging } } return factory; } finally { lock.writeLock().unlock(); } } protected abstract Log getLoggerImpl(Class<?> cls); protected abstract Log getLoggerImpl(String name); }