001 /**
002 * GRANITE DATA SERVICES
003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 * This file is part of the Granite Data Services Platform.
006 *
007 * Granite Data Services is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * Granite Data Services is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 * USA, or see <http://www.gnu.org/licenses/>.
021 */
022 package org.granite.logging;
023
024 import java.lang.reflect.Constructor;
025
026 import org.granite.scan.ServiceLoader;
027 import org.granite.util.TypeUtil;
028
029 /**
030 * @author Franck WOLFF
031 */
032 public abstract class Logger {
033
034 ///////////////////////////////////////////////////////////////////////////
035 // Fields.
036
037 public static final String LOGGER_IMPL_SYSTEM_PROPERTY = "org.granite.logger.impl";
038
039 private static final boolean slf4jAvailable;
040 private static final boolean log4jAvailable;
041 static {
042 boolean slf4j = false;
043 boolean log4j = false;
044 try {
045 TypeUtil.forName("org.slf4j.Logger");
046 slf4j = true;
047 }
048 catch (Exception e) {
049 try {
050 TypeUtil.forName("org.apache.log4j.Logger");
051 log4j = true;
052 }
053 catch (Exception f) {
054 }
055 }
056 slf4jAvailable = slf4j;
057 log4jAvailable = log4j;
058 }
059
060 private final Object loggerImpl;
061 private final LoggingFormatter formatter;
062
063 ///////////////////////////////////////////////////////////////////////////
064 // Constructor.
065
066 protected Logger(Object loggerImpl, LoggingFormatter formatter) {
067 this.loggerImpl = loggerImpl;
068 this.formatter = formatter;
069 }
070
071 ///////////////////////////////////////////////////////////////////////////
072 // Getters.
073
074 protected Object getLoggerImpl() {
075 return loggerImpl;
076 }
077
078 protected LoggingFormatter getFormatter() {
079 return formatter;
080 }
081
082 ///////////////////////////////////////////////////////////////////////////
083 // Static initializers.
084
085 public static Logger getLogger() {
086 return getLogger(new DefaultLoggingFormatter());
087 }
088
089 public static Logger getLogger(Class<?> clazz) {
090 return getLogger(clazz.getName(), new DefaultLoggingFormatter());
091 }
092
093 public static Logger getLogger(String name) {
094 return getLogger(name, new DefaultLoggingFormatter());
095 }
096
097 public static Logger getLogger(LoggingFormatter formatter) {
098 Throwable t = new Throwable();
099 StackTraceElement[] stes = t.getStackTrace();
100 if (stes.length < 2)
101 throw new RuntimeException("Illegal instantiation context (stacktrace elements should be of length >= 2)", t);
102 return getLogger(stes[1].getClassName());
103 }
104
105 public static Logger getLogger(Class<?> clazz, LoggingFormatter formatter) {
106 return getLogger(clazz.getName(), formatter);
107 }
108
109 public static Logger getLogger(String name, LoggingFormatter formatter) {
110 String loggerImplClass = System.getProperty(LOGGER_IMPL_SYSTEM_PROPERTY);
111 if (loggerImplClass != null) {
112 try {
113 Class<? extends Logger> clazz = TypeUtil.forName(loggerImplClass, Logger.class);
114 Constructor<? extends Logger> constructor = clazz.getConstructor(String.class, LoggingFormatter.class);
115 return constructor.newInstance(name, formatter);
116 } catch (Exception e) {
117 throw new RuntimeException(
118 "Could not create instance of: " + loggerImplClass +
119 " (" + LOGGER_IMPL_SYSTEM_PROPERTY + " system property)", e);
120 }
121 }
122
123 ServiceLoader<Logger> loader = ServiceLoader.load(Logger.class);
124 loader.setConstructorParameters(new Class<?>[]{String.class, LoggingFormatter.class}, new Object[]{name, formatter});
125 for (Logger logger : loader)
126 return logger;
127
128 return slf4jAvailable ? new Slf4jLogger(name, formatter) :
129 (log4jAvailable ? new Log4jLogger(name, formatter) : new JdkLogger(name, formatter));
130 }
131
132 ///////////////////////////////////////////////////////////////////////////
133 // Logging methods.
134
135 public abstract void info(String message, Object... args);
136 public abstract void info(Throwable t, String message, Object... args);
137
138 public abstract void trace(String message, Object... args);
139 public abstract void trace(Throwable t, String message, Object... args);
140
141 public abstract void warn(String message, Object... args);
142 public abstract void warn(Throwable t, String message, Object... args);
143
144 public abstract void debug(String message, Object... args);
145 public abstract void debug(Throwable t, String message, Object... args);
146
147 public abstract void error(String message, Object... args);
148 public abstract void error(Throwable t, String message, Object... args);
149
150 ///////////////////////////////////////////////////////////////////////////
151 // Configuration.
152
153 public abstract boolean isDebugEnabled();
154
155 public abstract boolean isErrorEnabled();
156
157 public abstract boolean isFatalEnabled();
158
159 public abstract boolean isInfoEnabled();
160
161 public abstract boolean isTraceEnabled();
162
163 public abstract boolean isWarnEnabled();
164 }