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