001: /*
002: * Copyright (c) 2004-2007 QOS.ch
003: * All rights reserved.
004: *
005: * Permission is hereby granted, free of charge, to any person obtaining
006: * a copy of this software and associated documentation files (the
007: * "Software"), to deal in the Software without restriction, including
008: * without limitation the rights to use, copy, modify, merge, publish,
009: * distribute, sublicense, and/or sell copies of the Software, and to
010: * permit persons to whom the Software is furnished to do so, subject to
011: * the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be
014: * included in all copies or substantial portions of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
017: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
018: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
019: * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
020: * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
021: * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
022: * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
023: */
024:
025: package org.slf4j;
026:
027: import org.slf4j.helpers.Util;
028: import org.slf4j.impl.StaticLoggerBinder;
029:
030: /**
031: * The <code>LoggerFactory</code> is a utility class producing Loggers for
032: * various logging APIs, most notably for log4j, logback and JDK 1.4 logging.
033: * Other implementations such as {@link org.slf4j.impl.NOPLogger NOPLogger} and
034: * {@link org.slf4j.impl.SimpleLogger SimpleLogger} are also supported.
035: *
036: * <p>
037: * <code>LoggerFactory</code> is essentially a wrapper around an
038: * {@link ILoggerFactory} instance bound with <code>LoggerFactory</code> at
039: * compile time.
040: *
041: * <p>
042: * Please note that all methods in <code>LoggerFactory</code> are static.
043: *
044: * @author Ceki Gülcü
045: */
046: public final class LoggerFactory {
047:
048: static ILoggerFactory loggerFactory;
049:
050: static final String NO_STATICLOGGERBINDER_URL = "http://www.slf4j.org/codes.html#StaticLoggerBinder";
051: static final String NULL_LF_URL = "http://www.slf4j.org/codes.html#null_LF";
052:
053: // private constructor prevents instantiation
054: private LoggerFactory() {
055: }
056:
057: static {
058: try {
059: loggerFactory = StaticLoggerBinder.SINGLETON
060: .getLoggerFactory();
061: } catch (NoClassDefFoundError ncde) {
062: String msg = ncde.getMessage();
063: if (msg != null
064: && msg.indexOf("org/slf4j/impl/StaticLoggerBinder") != -1) {
065: Util
066: .reportFailure("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");
067: Util.reportFailure("See " + NO_STATICLOGGERBINDER_URL
068: + " for further details.");
069:
070: }
071: throw ncde;
072: } catch (Exception e) {
073: // we should never get here
074: Util.reportFailure("Failed to instantiate logger ["
075: + StaticLoggerBinder.SINGLETON
076: .getLoggerFactoryClassStr() + "]", e);
077: }
078: }
079:
080: /**
081: * Return a logger named according to the name parameter using the statically
082: * bound {@link ILoggerFactory} instance.
083: *
084: * @param name
085: * The name of the logger.
086: * @return logger
087: */
088: public static Logger getLogger(String name) {
089: if (loggerFactory == null) {
090: throw new IllegalStateException(
091: "Logging factory implementation cannot be null. See also "
092: + NULL_LF_URL);
093: }
094: return loggerFactory.getLogger(name);
095: }
096:
097: /**
098: * Return a logger named corresponding to the class passed as parameter, using
099: * the statically bound {@link ILoggerFactory} instance.
100: *
101: * @param clazz
102: * the returned logger will be named after clazz
103: * @return logger
104: */
105: public static Logger getLogger(Class clazz) {
106: if (loggerFactory == null) {
107: throw new IllegalStateException(
108: "Logging factory implementation cannot be null. See also "
109: + NULL_LF_URL);
110: }
111: return loggerFactory.getLogger(clazz.getName());
112: }
113:
114: /**
115: * Return the {@link ILoggerFactory} instance in use.
116: *
117: * <p>ILoggerFactory instance is bound with this class at compile
118: * time.
119: *
120: * @return the ILoggerFactory instance in use
121: */
122: public static ILoggerFactory getILoggerFactory() {
123: return loggerFactory;
124: }
125: }
|