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 */ 022package org.granite.logging; 023 024import java.lang.reflect.Constructor; 025 026import org.granite.scan.ServiceLoader; 027import org.granite.util.TypeUtil; 028 029/** 030 * @author Franck WOLFF 031 */ 032public 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}