/* * Copyright (C) 2012 SeqWare * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.seqware.common.util; import java.io.PrintStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; /** * <p> * Log class. * </p> * * @author yongliang * @version $Id: $Id */ public class Log { private static boolean verbose; private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); /** * See {@link org.apache.log4j.Logger#debug(Object)}. * * @param message * the message to log. */ public static void trace(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.trace(message); } /** * See {@link org.apache.log4j.Logger#debug(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void trace(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.trace(message, t); } /** * See {@link org.apache.log4j.Logger#debug(Object)}. * * @param message * the message to log. */ public static void debug(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.debug(message); } /** * See {@link org.apache.log4j.Logger#debug(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void debug(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.debug(message, t); } /** * See {@link org.apache.log4j.Logger#info(Object)}. * * @param message * the message to log. */ public static void info(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.info(message); } /** * See {@link org.apache.log4j.Logger#info(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void info(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.info(message, t); } /** * See {@link org.apache.log4j.Logger#warn(Object)}. * * @param message * the message to log. */ public static void warn(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.warn(message); } /** * See {@link org.apache.log4j.Logger#warn(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void warn(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.warn(message, t); } /** * See {@link org.apache.log4j.Logger#error(Object)}. * * @param message * the message to log. */ public static void error(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.error(message); } /** * See {@link org.apache.log4j.Logger#error(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void error(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.error(message, t); } /** * See {@link org.apache.log4j.Logger#fatal(Object)}. * * @param message * the message to log. */ public static void fatal(final Object message) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.fatal(message); } /** * See {@link org.apache.log4j.Logger#fatal(Object,Throwable)}. * * @param message * the message to log. * @param t * the error stack trace. */ public static void fatal(final Object message, final Throwable t) { Logger logger = Logger.getLogger(getCallerClassName()); if (verbose) setVerboseLogger(logger); logger.fatal(message, t); } /** * <p> * stdout. * </p> * * @param message * a {@link java.lang.String} object. */ public static void stdout(final String message) { System.out.println(message); } /** * Output to stdout with the time pre-pended * * @param message * a {@link java.lang.String} object. */ public static void stdoutWithTime(final String message) { outputWithTime(message, System.out); } public static void stderrWithTime(final String message) { outputWithTime(message, System.err); } private static void outputWithTime(final String message, PrintStream stream) { // get current date time with Date() Date date = new Date(); stream.print("[" + DATE_FORMAT.format(date) + "] | "); stream.println(message); } /** * <p> * stderr. * </p> * * @param message * a {@link java.lang.String} object. */ public static void stderr(final String message) { System.err.println(message); } /** * override the log4j.properties * * @param b * a boolean. */ public static void setVerbose(boolean b) { Log.verbose = b; } // Private means that this class is a static singleton. private Log() { } /** * Info about the logger caller */ private static class CallInfo { public String className; public String methodName; public CallInfo() { } public CallInfo(String className, String methodName) { this.className = className; this.methodName = methodName; } } /** * @return the className of the class actually logging the message */ private static String getCallerClassName() { final int level = 5; return getCallerClassName(level); } /** * @return the className of the class actually logging the message */ private static String getCallerClassName(final int level) { CallInfo ci = getCallerInformations(level); return ci.className; } /** * Examine stack trace to get caller * * @param level * method stack depth * @return who called the logger */ private static CallInfo getCallerInformations(int level) { StackTraceElement[] callStack = Thread.currentThread().getStackTrace(); StackTraceElement caller = callStack[level]; return new CallInfo(caller.getClassName(), caller.getMethodName()); } private static void setVerboseLogger(Logger logger) { logger.setLevel(Level.DEBUG); logger.removeAllAppenders(); logger.addAppender(new ConsoleAppender(new PatternLayout("%p [%d{yyyy/MM/dd HH:mm:ss}] | %m%n"))); } }