package io.cattle.platform.logback; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.annotation.PostConstruct; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Startup { private static final String DEFAULT_TOKEN = "CATTLE_DEFAULT_LOGBACK_XML"; private static final String LOGBACK_DISABLE = "cattle.logback.disable"; private static final String LOGBACK_SYSTEM_CONFIG = "logback.configurationFile"; private static final String LOGBACK_CLASS = "ch.qos.logback.classic.LoggerContext"; private static final String LOGBACK_XML = "logback.xml"; private static final String[] STANDARD_CONFIG = new String[] { "logback.groovy", "logback-test.xml" }; final static Logger log = LoggerFactory.getLogger(Startup.class); @PostConstruct public void init() { if (shouldConfigure()) { try { Class<?> clz = Class.forName("io.cattle.platform.logback.LogbackStartup"); ((Runnable) clz.newInstance()).run(); } catch (Exception e) { log.warn("Failed to configure logback : {}", e.getMessage()); log.info("Failed to configure logback", e); } } } protected boolean shouldConfigure() { /* If there is no logback, probably shouldn't configure it */ try { Class.forName(LOGBACK_CLASS); } catch (ClassNotFoundException e) { return false; } /* Standard logback config file configuration */ if (System.getProperty(LOGBACK_SYSTEM_CONFIG) != null) { return false; } /* Look for a logback.xml file that is not ours */ URL url = Startup.class.getClassLoader().getResource(LOGBACK_XML); InputStream is = null; try { is = url.openStream(); if (!IOUtils.toString(is).contains(DEFAULT_TOKEN)) { return false; } } catch (IOException e) { log.error("Failed to read logback config", e); } finally { IOUtils.closeQuietly(is); } /* Look for other standard logback config files on the classpath */ for (String config : STANDARD_CONFIG) { if (this.getClass().getClassLoader().getResource(config) != null) { return false; } } /* Hook to disable logback configuration for whatever reason */ if (Boolean.getBoolean(LOGBACK_DISABLE)) { return false; } return true; } }