package esmska.utils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import org.apache.commons.lang.Validate; /** Support class for configuring logging capabilities * * @author ripper */ public class LogSupport { private static final Logger logger = Logger.getLogger(LogSupport.class.getName()); private static final Logger esmskaLogger = Logger.getLogger("esmska"); private static final Logger httpclientLogger = Logger.getLogger("org.apache.commons.httpclient"); private static final Logger httpclientWireLogger = Logger.getLogger("httpclient.wire.header"); private static final Logger[] loggers = new Logger[]{esmskaLogger, httpclientLogger, httpclientWireLogger}; private static ConsoleHandler consoleHandler = null; private static FileHandler fileHandler = null; private static final ArrayList<LogRecord> logBuffer = new ArrayList<LogRecord>(); private static final BufferHandler bufferHandler = new BufferHandler(); /** Initialize logging. Enables console handler. Use at startup. */ public static void init() { esmskaLogger.setLevel(Level.FINER); esmskaLogger.setUseParentHandlers(false); consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.INFO); for (Logger log : loggers) { log.addHandler(consoleHandler); } } /** Initialize logfile file handler. Republishes any previously stored * records into it. * @param logOutput where to log; not null */ public static void initFileHandler(File logOutput) throws IOException { Validate.notNull(logOutput); String pattern = logOutput.getAbsolutePath().replaceAll("%", "%%"); fileHandler = new FileHandler(pattern, true); fileHandler.setLevel(Level.ALL); fileHandler.setFormatter(new SimpleFormatter()); fileHandler.setEncoding("UTF-8"); for (Logger log : loggers) { log.addHandler(fileHandler); } for (LogRecord record : logBuffer) { fileHandler.publish(record); } logger.fine("Started logging into " + logOutput.getAbsolutePath()); } /** Whether to rememeber log records (useful for later inicialization of * file handler) or not (and erase old ones). */ public static void storeRecords(boolean store) { if (store) { for (Logger log : loggers) { log.addHandler(bufferHandler); } } else { for (Logger log : loggers) { log.removeHandler(bufferHandler); } logBuffer.clear(); } } /** Get main program logger */ public static Logger getEsmskaLogger() { return esmskaLogger; } /** Get handler for writing logs into console */ public static ConsoleHandler getConsoleHandler() { return consoleHandler; } /** Get handler for writing logs into file */ public static FileHandler getFileHandler() { return fileHandler; } /** Enable debug messages from HttpClient library */ public static void enableHttpClientLogging() { httpclientLogger.setLevel(Level.FINE); httpclientWireLogger.setLevel(Level.FINE); } /** Fake handler to remember all published messages */ private static class BufferHandler extends Handler { public BufferHandler() { setLevel(Level.ALL); } @Override public void publish(LogRecord record) { logBuffer.add(record); } @Override public void flush() { return; } @Override public void close() throws SecurityException { return; } } }