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 }