package org.wattdepot.common.util.logger; import java.io.File; import java.io.IOException; import java.util.Enumeration; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; /** * Provides a convenience method for Restlet logging that adjusts the output * Handlers. Portions of this code are adapted from * http://hackystat-utilities.googlecode.com/ * * @author Philip Johnson * @author Robert Brewer */ public final class LoggerUtil { /** Make this class non-instantiable. */ private LoggerUtil() { // Do nothing. } /** * Forces all Loggers to use the Console for logging output. */ public static void useConsoleHandler() { LogManager logManager = LogManager.getLogManager(); for (Enumeration<String> en = logManager.getLoggerNames(); en .hasMoreElements();) { String logName = en.nextElement(); Logger logger = logManager.getLogger(logName); // if (logName.startsWith("org.restlet")) { // logger.setLevel(Level.SEVERE); // } if (logger != null) { // remove the old handlers Handler[] handlers = logger.getHandlers(); for (Handler handler : handlers) { logger.removeHandler(handler); } } } Logger logger = logManager.getLogger(""); ConsoleHandler handler = new ConsoleHandler(); logger.addHandler(handler); } /** * Removes all the handlers from all the defined loggers. This should */ public static void disableLogging() { Logger base = LogManager.getLogManager().getLogger( Logger.GLOBAL_LOGGER_NAME); base = base.getParent(); base.setLevel(Level.SEVERE); } /** * Adjusts the Restlet Loggers so that they send their output to a file, not * the console. * * @param serverHome Home directory for this server. Logging files are placed * in [serverHome]/logs. If null, an IllegalArgumentException is * thrown. * @throws IllegalArgumentException If serverHome is null. * @throws RuntimeException If there are problems creating directories or * opening log file. */ public static void useFileHandler(String serverHome) { LogManager logManager = LogManager.getLogManager(); // System.out.println("In useFileHandler"); for (Enumeration<String> en = logManager.getLoggerNames(); en .hasMoreElements();) { String logName = en.nextElement(); if ((logName.startsWith("com.noelios") || logName.startsWith("org.restlet") || "global".equals(logName)) && logManager.getLogger(logName) != null) { // First, get rid of current Handlers Logger logger = logManager.getLogger(logName); logger.setFilter(new HTTPClientHelperFilter()); // System.out.println("logger is: " + logger + " name = " + logName); logger = logger.getParent(); // System.out.println("parent logger is: " + logger); Handler[] handlers = logger.getHandlers(); for (Handler handler : handlers) { logger.removeHandler(handler); } // System.out.println("Removed handlers."); // Define a handler that writes to the ~/.wattdepot3/<service>/logs // directory // Define a file handler that writes to the logs directory, creating it // if nec. if (serverHome == null) { throw new IllegalArgumentException( "Attempt to change Restlet logging to null filename"); } else { File logDir = new File(serverHome + "/logs/"); boolean dirsOk = logDir.mkdirs(); if (!dirsOk && !logDir.exists()) { throw new RuntimeException("mkdirs() failed"); } // System.out.println("Made this directory: " + logDir); String fileName = logDir + "/" + logName + ".%u.log"; FileHandler fileHandler; try { fileHandler = new FileHandler(fileName, 500000, 10, true); fileHandler.setFormatter(new SimpleFormatter()); logger.addHandler(fileHandler); } catch (IOException e) { // throw new RuntimeException // ("Could not open the log file for this WattDepot service.", e); System.out.println("Could not open log file: " + fileName + " " + e.getMessage()); } } } } } /** * Adjusts the Restlet Loggers so that they dump their output rather than * sending it to the console. */ public static void removeRestletLoggers() { LogManager logManager = LogManager.getLogManager(); for (Enumeration<String> en = logManager.getLoggerNames(); en .hasMoreElements();) { String logName = en.nextElement(); if ((logName.startsWith("com.noelios") || logName.startsWith("org.restlet") || "global".equals(logName) || logName .startsWith("org.hibernate")) && logManager.getLogger(logName) != null) { Logger logger = logManager.getLogger(logName); logger = logger.getParent(); Handler[] handlers = logger.getHandlers(); for (Handler handler : handlers) { logger.removeHandler(handler); } } } } /** * Sets the logging level to be used for this WattDepot logger. If the passed * string cannot be parsed into a Level, then INFO is set by default. * * @param logger The logger whose level is to be set. * @param level The new Level. */ public static void setLoggingLevel(Logger logger, String level) { Level newLevel = Level.INFO; try { newLevel = Level.parse(level); } catch (Exception e) { logger.info("Couldn't set Logging level to: " + level); } logger.setLevel(newLevel); for (Handler handler : logger.getHandlers()) { handler.setLevel(newLevel); } } /** * Utility for printing out the known/defined logger names. */ public static void showLoggers() { LogManager logManager = LogManager.getLogManager(); for (Enumeration<String> en = logManager.getLoggerNames(); en .hasMoreElements();) { String logName = en.nextElement(); Logger logger = logManager.getLogger(logName); Logger parent = logger.getParent(); System.out.print("logger name = '" + logName + "'"); System.out.print(" level = '" + logger.getLevel() + "'"); if (parent != null) { System.out.print(" parent = '" + parent.getName() + "'"); } System.out.println(); } } }