package org.fcrepo.utilities; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import org.fcrepo.common.FaultException; /** * Logger configuration utility methods. * <p> * This class provides convenience methods for configuring Logback when * the default configuration files (logback.xml or logback-test.xml) are not * expected to be found in the classpath of the running application. * <p> * Note: * <ul> * <li> This class intentionally has no compile or run-time dependencies on * Logback. If Logback is not in the classpath, calling these methods * will have no effect on the application's logging behavior.</li> * <li> If the <code>logback.configurationFile</code> system property is * already defined, calling these methods will have no effect.</li> * </ul> * * @author Chris Wilper */ public abstract class LogConfig { private static final String CONFIG_FILE_PROPERTY = "logback.configurationFile"; /** * Initializes logging with the given file. * * @param configFile the logback.xml file to use. */ public static void initFromFile(File configFile) { if (!alreadyConfigured()) { System.setProperty(CONFIG_FILE_PROPERTY, configFile.getPath()); } } /** * Initializes logging to the console (standard error) with minimal logging. * <p> * For all categories, only WARN and ERROR messages will be printed, * and the messages will be of the form "LEVEL time (classname) message" */ public static void initMinimal() { if (!alreadyConfigured()) { initFromFile(createTempConfigFile("WARN")); } } private static boolean alreadyConfigured() { return System.getProperty(CONFIG_FILE_PROPERTY) != null; } private static File createTempConfigFile(String level) { PrintWriter writer = null; try { File tempFile = File.createTempFile("fedora-logback-minimal", null); tempFile.deleteOnExit(); writer = new PrintWriter(new OutputStreamWriter( new FileOutputStream(tempFile))); writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.println("<configuration>"); writer.println(" <appender name=\"STDERR\" class=\"ch.qos.logback.core.ConsoleAppender\">"); writer.println(" <Target>System.err</Target>"); writer.println(" <layout class=\"ch.qos.logback.classic.PatternLayout\">"); writer.println(" <Pattern>%p %d{HH:mm:ss.SSS} (%c{0}\\\\) %m%n</Pattern>"); writer.println(" </layout>"); writer.println(" </appender>"); writer.println(" <root additivity=\"false\" level=\"" + level + "\">"); writer.println(" <appender-ref ref=\"STDERR\"/>"); writer.println(" </root>"); writer.println("</configuration>"); return tempFile; } catch (IOException e) { throw new FaultException("Error creating temporary log config file", e); } finally { if (writer != null) { writer.close(); } } } }