package org.springside.examples.showcase.log.trace;
import java.util.Enumeration;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* 控制是否输出DEBUG信息到Trace Appender的MBean, 可用JMX或JSP调用.
*
* @author jeff zhu
*/
@ManagedResource(objectName = TraceMBean.TRACE_MBEAN_NAME, description = "Trace Management Bean")
public class TraceMBean {
/**
* TraceMbean的注册名称.
*/
public static final String TRACE_MBEAN_NAME = "Showcase:name=trace,type=Trace";
private String traceLoggerName = "org.springside.examples.showcase";
@ManagedAttribute(description = "Check if the trace is open or not")
public boolean getTraceStatus() {
Logger logger = Logger.getLogger(traceLoggerName);
Level level = logger.getEffectiveLevel();
return level.getSyslogEquivalent() >= Level.DEBUG.getSyslogEquivalent();
}
@ManagedOperation(description = "Start trace")
public void startTrace() {
Logger logger = Logger.getLogger(traceLoggerName);
logger.setLevel(Level.DEBUG);
setLoggerAppendersLevel(logger, Level.DEBUG);
}
@ManagedOperation(description = "Stop trace")
public void stopTrace() {
Logger logger = Logger.getLogger(traceLoggerName);
logger.setLevel(Level.INFO);
setLoggerAppendersLevel(logger, Level.OFF);
}
@SuppressWarnings("unchecked")
private void setLoggerAppendersLevel(Logger logger, Level level) {
Enumeration e = logger.getAllAppenders();
while (e.hasMoreElements()) {
AppenderSkeleton appender = (AppenderSkeleton) e.nextElement();
appender.setThreshold(level);
}
}
public void setTraceLoggerName(String traceLoggerName) {
this.traceLoggerName = traceLoggerName;
}
}