package fuse.logging; import org.apache.commons.logging.Log; import java.io.PrintStream; import java.util.*; /** * User: peter * Date: Nov 4, 2005 * Time: 8:03:57 PM */ public class FuseLog implements Log { public static PrintStream trace = System.err; public static PrintStream debug = System.err; public static PrintStream info = System.err; public static PrintStream warn = System.err; public static PrintStream error = System.err; public static PrintStream fatal = System.err; public static void setOut(PrintStream out) { trace = debug = info = warn = error = fatal = out; } public static final String LEVEL_PREFIX = "fuse.logging.level"; private static final int LEVEL_TRACE = 0; private static final int LEVEL_DEBUG = 1; private static final int LEVEL_INFO = 2; private static final int LEVEL_WARN = 3; private static final int LEVEL_ERROR = 4; private static final int LEVEL_FATAL = 5; private static final String[] levelNames = new String[] { "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; private static final String formatPattern = "%1$tH:%1$tM:%1$tS.%1$tL %2$8s %3$5s [%4$s]: %5$s%n"; private static final Levels levels = new Levels(); private String name; public FuseLog(String name) { this.name = name; } // // implementation of Log interface public boolean isDebugEnabled() { return levels.isDebugEnabled(name); } public boolean isErrorEnabled() { return levels.isErrorEnabled(name); } public boolean isFatalEnabled() { return levels.isFatalEnabled(name); } public boolean isInfoEnabled() { return levels.isInfoEnabled(name); } public boolean isTraceEnabled() { return levels.isTraceEnabled(name); } public boolean isWarnEnabled() { return levels.isWarnEnabled(name); } public void trace(Object object) { _log(LEVEL_TRACE, trace, object, null); } public void trace(Object object, Throwable throwable) { _log(LEVEL_TRACE, trace, object, throwable); } public void debug(Object object) { _log(LEVEL_DEBUG, debug, object, null); } public void debug(Object object, Throwable throwable) { _log(LEVEL_DEBUG, debug, object, throwable); } public void info(Object object) { _log(LEVEL_INFO, info, object, null); } public void info(Object object, Throwable throwable) { _log(LEVEL_INFO, info, object, throwable); } public void warn(Object object) { _log(LEVEL_WARN, warn, object, null); } public void warn(Object object, Throwable throwable) { _log(LEVEL_WARN, warn, object, throwable); } public void error(Object object) { _log(LEVEL_ERROR, error, object, null); } public void error(Object object, Throwable throwable) { _log(LEVEL_ERROR, error, object, throwable); } public void fatal(Object object) { _log(LEVEL_FATAL, fatal, object, null); } public void fatal(Object object, Throwable throwable) { _log(LEVEL_FATAL, fatal, object, throwable); } // // logging routine private void _log(int levelValue, PrintStream stream, Object object, Throwable throwable) { if (levelValue >= levels.getLevelValue(name)) { String msg; if (object instanceof Throwable && throwable == null) throwable = (Throwable) object; msg = object.toString(); stream.printf(formatPattern, new Date(), Thread.currentThread().getName(), levelNames[levelValue], name, msg); if (throwable != null) throwable.printStackTrace(stream); } } private static class Levels { private Map<String, Integer> name2levelMap = new HashMap<String, Integer>(); Levels() { Properties props = System.getProperties(); for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) { String propName = (String) e.nextElement(); if (propName.startsWith(LEVEL_PREFIX)) { String levelKey = (propName.length() == LEVEL_PREFIX.length())? "" : propName.substring(LEVEL_PREFIX.length() + 1); String levelName = props.getProperty(propName); int levelValue = -1; for (int i = 0; i < levelNames.length; i++) { if (levelNames[i].equals(levelName)) { levelValue = i; break; } } if (levelValue < 0) throw new IllegalArgumentException("Invalid logging level specified for System property: " + propName + ": " + levelName); name2levelMap.put(levelKey, new Integer(levelValue)); } } } boolean isDebugEnabled(String name) { return getLevelValue(name) <= LEVEL_DEBUG; } boolean isErrorEnabled(String name) { return getLevelValue(name) <= LEVEL_ERROR; } boolean isFatalEnabled(String name) { return getLevelValue(name) <= LEVEL_FATAL; } boolean isInfoEnabled(String name) { return getLevelValue(name) <= LEVEL_INFO; } boolean isTraceEnabled(String name) { return getLevelValue(name) <= LEVEL_TRACE; } boolean isWarnEnabled(String name) { return getLevelValue(name) <= LEVEL_WARN; } public String toString(String name) { return levelNames[getLevelValue(name)]; } private int getLevelValue(String name) { while (true) { Integer levelValue = (Integer) name2levelMap.get(name); if (levelValue != null) return levelValue.intValue(); if (name.length() == 0) { break; } else { int lastDot = name.lastIndexOf('.'); if (lastDot >= 0) name = name.substring(0, lastDot); else name = ""; } } //default ROOT level return LEVEL_INFO; } } }