package grails.plugin.lightweightdeploy.logging;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.jmx.JMXConfigurator;
import ch.qos.logback.classic.jul.LevelChangePropagator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import grails.plugin.lightweightdeploy.Configuration;
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.Map;
/**
* Borrowed heavily from com.yammer.dropwizard.logging.LoggingFactory.
*/
public class ServerLoggingFactory {
private final Configuration config;
public ServerLoggingFactory(Configuration config) {
this.config = config;
}
public void configure() {
//detach current appenders;
getCleanRoot();
hijackJDKLogging();
final Logger root = configureLevels();
for (Appender<ILoggingEvent> appender : LogbackFactory.buildAppenders(
config.getServerLogConfiguration(),
root.getLoggerContext())) {
root.addAppender(AsyncAppender.wrap(appender));
}
final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
try {
final ObjectName objectName = new ObjectName("grails.plugin.lightweightdeploy:type=Logging");
if (!server.isRegistered(objectName)) {
server.registerMBean(new JMXConfigurator(root.getLoggerContext(),
server,
objectName),
objectName);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void hijackJDKLogging() {
//doesn't work in current version of jul-to-slf4j
//SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
private Logger configureLevels() {
final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
root.getLoggerContext().reset();
final LevelChangePropagator propagator = new LevelChangePropagator();
propagator.setContext(root.getLoggerContext());
propagator.setResetJUL(true);
root.getLoggerContext().addListener(propagator);
root.setLevel(config.getServerLogConfiguration().getRootLevel());
for (Map.Entry<String, Level> entry : config.getServerLogConfiguration().getLoggers().entrySet()) {
((Logger) LoggerFactory.getLogger(entry.getKey())).setLevel(entry.getValue());
}
return root;
}
private static Logger getCleanRoot() {
final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
root.detachAndStopAllAppenders();
return root;
}
}