package com.kendelong.util.jmx; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedOperationParameter; import org.springframework.jmx.export.annotation.ManagedOperationParameters; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.stereotype.Component; /** * A JMX bean that allows you to set logger levels at runtime through the JMX console. * * @author Ken DeLong * */ @ManagedResource(objectName="logging:service=logger", description="Log4j Logger Configurer") @Component public class LogConfigurer { private final org.slf4j.Logger mylogger = org.slf4j.LoggerFactory.getLogger(this.getClass()); @ManagedOperation(description="Retrieve the logger level for a specific class") @ManagedOperationParameters ({ @ManagedOperationParameter(name="clazz", description="The class name for the logger") }) public String getLoggerLevel(String clazz) { Logger logger = Logger.getLogger(clazz); if (logger == null) { return "logger not present"; } Level level = logger.getLevel(); return level == null? "not defined" : level.toString(); } @ManagedOperation(description="Set the logger level for a specific class") @ManagedOperationParameters ({ @ManagedOperationParameter(name="clazz", description="The class name for the logger"), @ManagedOperationParameter(name="level", description="The level for the logger (DEBUG, INFO, ERROR, FATAL, WARN)") }) public void setLoggerLevel(String clazz, String level) { Level elevel = Level.toLevel(level); if (!elevel.toString().equals(level)) { throw new IllegalArgumentException(level + " is not a valid logger level"); } Logger logger = Logger.getLogger(clazz); if (logger != null) { logger.setLevel(elevel); mylogger.info("Setting [" + clazz + "] to level [" + level + "]"); } } }