// Copyright (c) 2002 Dustin Sallings <dustin@spy.net> package net.spy.log; /** * Logging implementation using the sun logger. */ public class SunLogger extends AbstractLogger { // Can't really import this without confusion as there's another thing // by this name in here. private final java.util.logging.Logger sunLogger; /** * Get an instance of SunLogger. */ public SunLogger(String name) { super(name); // Get the sun logger instance. sunLogger=java.util.logging.Logger.getLogger(name); } /** * True if the underlying logger would allow Level.FINE through. */ @Override public boolean isDebugEnabled() { return(sunLogger.isLoggable(java.util.logging.Level.FINE)); } /** * True if the underlying logger would allow Level.INFO through. */ @Override public boolean isInfoEnabled() { return(sunLogger.isLoggable(java.util.logging.Level.INFO)); } /** * Wrapper around sun logger. * * @param level net.spy.log.AbstractLogger level. * @param message object message * @param e optional throwable */ @Override public void log(Level level, Object message, Throwable e) { java.util.logging.Level sLevel=java.util.logging.Level.SEVERE; switch(level == null ? Level.FATAL : level) { case DEBUG: sLevel=java.util.logging.Level.FINE; break; case INFO: sLevel=java.util.logging.Level.INFO; break; case WARN: sLevel=java.util.logging.Level.WARNING; break; case ERROR: sLevel=java.util.logging.Level.SEVERE; break; case FATAL: sLevel=java.util.logging.Level.SEVERE; break; default: // I don't know what this is, so consider it fatal sLevel=java.util.logging.Level.SEVERE; sunLogger.log(sLevel, "Unhandled log level: " + level + " for the following message"); } // Figure out who was logging. Throwable t=new Throwable(); StackTraceElement[] ste=t.getStackTrace(); StackTraceElement logRequestor=null; String alclass=AbstractLogger.class.getName(); for(int i=0; i<ste.length && logRequestor==null; i++) { if(ste[i].getClassName().equals(alclass)) { // Make sure there's another stack frame. if(i+1<ste.length) { logRequestor=ste[i+1]; if(logRequestor.getClassName().equals(alclass)) { logRequestor=null; } // Also AbstractLogger } // Found something that wasn't abstract logger } // check for abstract logger } // See if we could figure out who was doing the original logging, // if we could, we want to include a useful class and method name if(logRequestor!=null) { if(e != null) { sunLogger.logp(sLevel, logRequestor.getClassName(), logRequestor.getMethodName(), message.toString(), e); } else { sunLogger.logp(sLevel, logRequestor.getClassName(), logRequestor.getMethodName(), message.toString()); } } else { if(e != null) { sunLogger.log(sLevel, message.toString(), e); } else { sunLogger.log(sLevel, message.toString()); } } } }