package org.hotswap.agent.logging;
import java.util.HashMap;
import java.util.Map;
/**
* Create custom simple logging mechanism.
* <p/>
* Instead of java.util.logging because many frameworks and APP servers will complicate/override settings.
*
* @author Jiri Bubnik
*/
public class AgentLogger {
/**
* Get logger for a class
*
* @param clazz class to log
* @return logger
*/
public static AgentLogger getLogger(Class clazz) {
return new AgentLogger(clazz);
}
private static Map<String, Level> currentLevels = new HashMap<String, Level>();
public static void setLevel(String classPrefix, Level level) {
currentLevels.put(classPrefix, level);
}
private static Level rootLevel = Level.INFO;
public static void setLevel(Level level) {
rootLevel = level;
}
private static AgentLoggerHandler handler = new AgentLoggerHandler();
public static void setHandler(AgentLoggerHandler handler) {
AgentLogger.handler = handler;
}
public static AgentLoggerHandler getHandler() {
return handler;
}
public static void setDateTimeFormat(String dateTimeFormat) {
handler.setDateTimeFormat(dateTimeFormat);
}
/**
* Standard logging levels.
*/
public enum Level {
ERROR,
RELOAD,
WARNING,
INFO,
DEBUG,
TRACE
}
private Class clazz;
private AgentLogger(Class clazz) {
this.clazz = clazz;
}
public boolean isLevelEnabled(Level level) {
Level classLevel = rootLevel;
String className = clazz.getName();
String longestPrefix = "";
for (String classPrefix : currentLevels.keySet()) {
if (className.startsWith(classPrefix)) {
if (classPrefix.length() > longestPrefix.length()) {
longestPrefix = classPrefix;
classLevel = currentLevels.get(classPrefix);
}
}
}
// iterate levels in order from most serious. If classLevel is first, it preciedes required level and log is disabled
for (Level l : Level.values()) {
if (l == level)
return true;
if (l == classLevel)
return false;
}
throw new IllegalArgumentException("Should not happen.");
}
public void log(Level level, String message, Throwable throwable, Object... args) {
if (isLevelEnabled(level))
handler.print(clazz, level, message, throwable, args);
}
public void log(Level level, String message, Object... args) {
log(level, message, null, args);
}
public void error(String message, Object... args) {
log(Level.ERROR, message, args);
}
public void error(String message, Throwable throwable, Object... args) {
log(Level.ERROR, message, throwable, args);
}
public void reload(String message, Object... args) {
log(Level.RELOAD, message, args);
}
public void reload(String message, Throwable throwable, Object... args) {
log(Level.RELOAD, message, throwable, args);
}
public void warning(String message, Object... args) {
log(Level.WARNING, message, args);
}
public void warning(String message, Throwable throwable, Object... args) {
log(Level.WARNING, message, throwable, args);
}
public void info(String message, Object... args) {
log(Level.INFO, message, args);
}
public void info(String message, Throwable throwable, Object... args) {
log(Level.INFO, message, throwable, args);
}
public void debug(String message, Object... args) {
log(Level.DEBUG, message, args);
}
public void debug(String message, Throwable throwable, Object... args) {
log(Level.DEBUG, message, throwable, args);
}
public void trace(String message, Object... args) {
log(Level.TRACE, message, args);
}
public void trace(String message, Throwable throwable, Object... args) {
log(Level.TRACE, message, throwable, args);
}
public boolean isDebugEnabled() {
return isLevelEnabled(Level.DEBUG);
}
public boolean isWarnEnabled() {
return isLevelEnabled(Level.WARNING);
}
}