001    package org.hackystat.utilities.logger;
002    
003    import java.io.File;
004    import java.io.IOException;
005    import java.util.Enumeration;
006    import java.util.logging.FileHandler;
007    import java.util.logging.Handler;
008    import java.util.logging.LogManager;
009    import java.util.logging.Logger;
010    import java.util.logging.SimpleFormatter;
011    
012    import org.hackystat.utilities.home.HackystatUserHome;
013    
014    /**
015     * Provides a convenience method for Restlet logging that adjusts the output Handlers.
016     * @author Philip Johnson
017     */
018    public final class RestletLoggerUtil {
019      
020      /** Make this class noninstantiable. */
021      private RestletLoggerUtil() {
022        // Do nothing.
023      }
024      
025      /**
026       * Returns true if logName is a Restlet logger in logManager.
027       * @param logName The logger name.
028       * @return True if it's a Restlet Logger.
029       */
030      private static boolean isRestletLoggerName(String logName) {
031        LogManager logManager = LogManager.getLogManager();
032        return 
033        ((logName.startsWith("com.noelios") || 
034          logName.startsWith("org.restlet") || 
035            "global".equals(logName)) 
036            &&
037           (logManager.getLogger(logName) != null));
038      }
039      
040      /**
041       * Adjusts the Restlet Loggers so that they send their output to a file, not the console.
042       * Deprecated because this leads to a zillion lock errors.  
043       * @param serviceDir The directory within .hackystat that this data will be sent to.
044       */
045      @Deprecated
046      public static void useFileHandler(String serviceDir) {
047        LogManager logManager = LogManager.getLogManager();
048        //System.out.println("In useFileHandler");
049        for (Enumeration<String> en = logManager.getLoggerNames(); en.hasMoreElements() ;) {
050          String logName = en.nextElement();
051          //System.out.println("logName is: '" + logName + "'");
052          if (isRestletLoggerName(logName)) {
053            // First, get rid of current Handlers
054            Logger logger = logManager.getLogger(logName);
055            //System.out.println("logger is: " + logger);
056            logger = logger.getParent();
057            //System.out.println("parent logger is: " + logger);
058            Handler[] handlers = logger.getHandlers();
059            for (Handler handler : handlers) {
060              logger.removeHandler(handler);
061            }
062            //System.out.println("Removed handlers.");
063            // Define a handler that writes to the ~/.hackystat/<service>/logs directory
064            File logDir = new File(HackystatUserHome.getHome(), 
065                ".hackystat/" + serviceDir + "/logs/");
066            boolean dirsOk = logDir.mkdirs();
067            if (!dirsOk && !logDir.exists()) {
068              throw new RuntimeException("mkdirs() failed");
069            }
070            //System.out.println("Made this directory: " + logDir);
071            String fileName = logDir + "/" + logName + ".%g.%u.log";
072            FileHandler fileHandler;
073            try {
074              fileHandler = new FileHandler(fileName, 500000, 10, true);
075              fileHandler.setFormatter(new SimpleFormatter());
076              logger.addHandler(fileHandler);
077            }
078            catch (IOException e) {
079              //throw new RuntimeException
080              // ("Could not open the log file for this Hackystat service.", e);
081              System.out.println("Could not open log file: " + fileName + " " + e.getMessage());
082            }
083          }
084        }
085      }
086      
087      /**
088       * Disables all Restlet-based loggers unless the property dont.disable.restlet.loggers
089       * has the value "true".
090       */
091      public static void disableLogging() {
092        // Disable the disable if there's a system property telling us not to disable.
093        if ("true".equals(System.getProperty("dont.disable.restlet.loggers"))) {
094          return;
095        }
096        LogManager logManager = LogManager.getLogManager();
097        for (Enumeration<String> en = logManager.getLoggerNames(); en.hasMoreElements() ;) {
098          String logName = en.nextElement();
099          if (isRestletLoggerName(logName)) {
100            Logger logger = logManager.getLogger(logName);
101            logger = logger.getParent();
102            Handler[] handlers = logger.getHandlers();
103            for (Handler handler : handlers) {
104              logger.removeHandler(handler);
105            }
106          }
107        }
108      }
109    }