package org.yajul.log;
import java.util.logging.Logger;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.List;
import java.util.ArrayList;
/**
* JMX MBean that plugs in the JULI->Log4j handler on start and unplugs it on stop.
* Here is an example of a JBoss JMX MBean declaration:
* <pre>
* <!-- Redirect java.util.logging to Log4J. -->
* <mbean code="org.yajul.log.JuliToLog4JService"
* name="org.yajul:service=JuliToLog4J">
* <attribute name="HandlerLevel">DEBUG</attribute>
* <depends>jboss.system:type=Log4jService,service=Logging</depends>
* </mbean>
* </pre>
* Note that because of a small glitch in the JMX specification, the attribute name
* is 'HandlerLevel', and not 'handlerLevel' as you might expect.
* See http://madplanet.com/jboss-docu-wiki/Wiki.jsp?page=40.JMX.MBean
* <br>
* User: josh
* Date: Jun 4, 2008
* Time: 3:41:44 PM
*/
public class JuliToLog4JService implements JuliToLog4JServiceMBean {
private Handler activeHandler;
private List<Handler> oldHandlers = new ArrayList<Handler>();
private Level handlerLevel = Level.ALL;
private Level rootLevel = Level.INFO;
public void start() throws Exception {
try {
JuliToLog4jHandler.getTargetLogger(JuliToLog4JService.class).info(
"start(): Redirecting java.util.logging to Log4J...");
Logger rootLogger = LogManager.getLogManager().getLogger("");
// remove old handlers
for (Handler handler : rootLogger.getHandlers()) {
oldHandlers.add(handler);
rootLogger.removeHandler(handler);
}
// add our own
activeHandler = new JuliToLog4jHandler();
activeHandler.setLevel(handlerLevel);
rootLogger.addHandler(activeHandler);
rootLogger.setLevel(rootLevel);
// done, let's check it right away!!!
Logger.getLogger(JuliToLog4JService.class.getName()).info("started: sending JDK log messages to Log4J");
} catch (Exception exc) {
JuliToLog4jHandler.getTargetLogger(JuliToLog4JService.class).error("start() failed", exc);
}
}
public void stop() {
Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.removeHandler(activeHandler);
// Put all the old handlers back.
for (Handler oldHandler : oldHandlers) {
rootLogger.addHandler(oldHandler);
}
Logger.getLogger(JuliToLog4jHandler.class.getName()).info("stopped");
}
public String getHandlerLevel() {
return handlerLevel.getName();
}
public void setHandlerLevel(String level) {
final String parseThis = level.toUpperCase();
if ("DEBUG".equalsIgnoreCase(parseThis))
handlerLevel = Level.FINE;
else
handlerLevel = Level.parse(parseThis);
}
}