All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yammer.dropwizard.config.LoggingFactory Maven / Gradle / Ivy

package com.yammer.dropwizard.config;

import com.yammer.dropwizard.logging.LogFormatter;
import com.yammer.dropwizard.logging.LoggingBean;
import com.yammer.metrics.log4j.InstrumentedAppender;
import org.apache.log4j.*;
import org.apache.log4j.net.SyslogAppender;
import org.apache.log4j.varia.NullAppender;
import org.slf4j.bridge.SLF4JBridgeHandler;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.Map;

import static com.yammer.dropwizard.config.LoggingConfiguration.ConsoleConfiguration;
import static com.yammer.dropwizard.config.LoggingConfiguration.FileConfiguration;
import static com.yammer.dropwizard.config.LoggingConfiguration.SyslogConfiguration;

// TODO: 11/7/11  -- document LoggingFactory
// TODO: 11/7/11  -- test LoggingFactory

public class LoggingFactory {
    public static void bootstrap() {
        final ConsoleAppender appender = new ConsoleAppender(new LogFormatter());
        appender.setThreshold(Level.WARN);
        Logger.getRootLogger().addAppender(appender);
    }

    private final LoggingConfiguration config;

    public LoggingFactory(LoggingConfiguration config) {
        this.config = config;
    }

    public void configure() {
        hijackJDKLogging();

        final Logger root = configureLevels();

        final AsyncAppender appender = new AsyncAppender();
        root.addAppender(appender);

        configureConsoleLogging(appender);
        configureFileLogging(appender);
        configureSyslogLogging(appender);

        final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        try {
            final ObjectName name = new ObjectName("com.yammer:type=Logging");
            server.registerMBean(new LoggingBean(), name);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        // add in an instrumented null appender to get full logging stats
        LogManager.getRootLogger().addAppender(new InstrumentedAppender(new NullAppender()));
    }

    private void hijackJDKLogging() {
        final java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
        for (java.util.logging.Handler handler : root.getHandlers()) {
            root.removeHandler(handler);
        }
        root.addHandler(new SLF4JBridgeHandler());
    }

    private Logger configureLevels() {
        final Logger root = Logger.getRootLogger();
        root.getLoggerRepository().resetConfiguration();
        root.setLevel(config.getLevel());

        for (Map.Entry entry : config.getLoggers().entrySet()) {
            Logger.getLogger(entry.getKey()).setLevel(entry.getValue());
        }

        return root;
    }

    private void configureSyslogLogging(AsyncAppender appender) {
        final SyslogConfiguration syslog = config.getSyslogConfiguration();
        if (syslog.isEnabled()) {
            final Layout layout = new PatternLayout("%c: %m");
            final SyslogAppender a = new SyslogAppender();
            a.setLayout(layout);
            a.setSyslogHost(syslog.getHost());
            a.setFacility(syslog.getFacility());
            a.setThreshold(syslog.getThreshold());
            appender.addAppender(a);
        }
    }

    private void configureFileLogging(AsyncAppender appender) {
        final FileConfiguration file = config.getFileConfiguration();
        if (file.isEnabled()) {
            final RollingFileAppender a = new RollingFileAppender();
            a.setLayout(new LogFormatter());
            a.setAppend(true);
            a.setFile(file.getFilenamePattern());
            a.setMaximumFileSize(file.getMaxFileSize().toBytes());
            a.setMaxBackupIndex(file.getRetainedFileCount());
            a.setThreshold(file.getThreshold());
            a.activateOptions();
            appender.addAppender(a);
        }
    }

    private void configureConsoleLogging(AsyncAppender appender) {
        final ConsoleConfiguration console = config.getConsoleConfiguration();
        if (console.isEnabled()) {
            final ConsoleAppender a = new ConsoleAppender(new LogFormatter());
            a.setThreshold(console.getThreshold());
            appender.addAppender(a);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy