package org.luawars; import org.slf4j.helpers.FormattingTuple; import org.slf4j.helpers.MessageFormatter; import java.io.PrintStream; import java.util.Date; /** * Created with IntelliJ IDEA. * User: gslepak * Date: 3/10/13 * Time: 3:02 AM * To change this template use File | Settings | File Templates. */ public class Log { public enum LEVEL { TRACE, DEBUG, INFO, WARN, ERROR } public static final LEVEL TRACE = LEVEL.TRACE; public static final LEVEL DEBUG = LEVEL.DEBUG; public static final LEVEL INFO = LEVEL.INFO; public static final LEVEL WARN = LEVEL.WARN; public static final LEVEL ERROR = LEVEL.ERROR; public static LEVEL currentLevel = INFO; public static boolean showTime = true; public static boolean showThread = true; private static void formatAndLog(LEVEL level, String format, Object arg1, Object arg2) { if (currentLevel.compareTo(level) <= 0) { FormattingTuple tp = MessageFormatter.format(format, arg1, arg2); log(level, tp.getMessage(), tp.getThrowable()); } } private static void formatAndLog(LEVEL level, String format, Object... arguments) { if (currentLevel.compareTo(level) <= 0) { FormattingTuple tp = MessageFormatter.arrayFormat(format, arguments); log(level, tp.getMessage(), tp.getThrowable()); } } public static String me() { StackTraceElement t = Thread.currentThread().getStackTrace()[2]; return t.getClassName()+"."+t.getMethodName()+":"+t.getLineNumber(); } public static String me(int idx) { StackTraceElement t = Thread.currentThread().getStackTrace()[2+idx]; return t.getClassName()+"."+t.getMethodName()+":"+t.getLineNumber(); } public static void logEnterMethod(LEVEL l) { logEnterMethod(l, 1); } public static void logExitMethod(LEVEL l) { logExitMethod(l, 1); } public static void logEnterMethod(LEVEL l, int idx) { log(l, me(1+idx) + "...", null); } public static void logExitMethod(LEVEL l, int idx) { log(l, me(1+idx) + " done!", null); } public static void trace(String msg) { log(TRACE, msg, null); } public static void trace(String format, Object param1) { formatAndLog(TRACE, format, param1, null); } public static void trace(String format, Object param1, Object param2) { formatAndLog(TRACE, format, param1, param2); } public static void trace(String format, Object... argArray) { formatAndLog(TRACE, format, argArray); } public static void trace(String msg, Throwable t) { log(TRACE, msg, t); } public static void debug(String msg) { log(DEBUG, msg, null); } public static void debug(String format, Object param1) { formatAndLog(DEBUG, format, param1, null); } public static void debug(String format, Object param1, Object param2) { formatAndLog(DEBUG, format, param1, param2); } public static void debug(String format, Object... argArray) { formatAndLog(DEBUG, format, argArray); } public static void debug(String msg, Throwable t) { log(DEBUG, msg, t); } public static void info(String msg) { log(INFO, msg, null); } public static void info(String format, Object arg) { formatAndLog(INFO, format, arg, null); } public static void info(String format, Object arg1, Object arg2) { formatAndLog(INFO, format, arg1, arg2); } public static void info(String format, Object... argArray) { formatAndLog(INFO, format, argArray); } public static void info(String msg, Throwable t) { log(INFO, msg, t); } public static void warn(String msg) { log(WARN, msg, null); } public static void warn(String format, Object arg) { formatAndLog(WARN, format, arg, null); } public static void warn(String format, Object arg1, Object arg2) { formatAndLog(WARN, format, arg1, arg2); } public static void warn(String format, Object... argArray) { formatAndLog(WARN, format, argArray); } public static void warn(String msg, Throwable t) { log(WARN, msg, t); } public static void error(String msg) { log(ERROR, msg, null); } public static void error(String format, Object arg) { formatAndLog(ERROR, format, arg, null); } public static void error(String format, Object arg1, Object arg2) { formatAndLog(ERROR, format, arg1, arg2); } public static void error(String format, Object... argArray) { formatAndLog(ERROR, format, argArray); } public static void error(String msg, Throwable t) { log(ERROR, msg, t); } private static void log(LEVEL level, String message, Throwable t) { if (currentLevel.compareTo(level) > 0) return; StringBuilder buf = new StringBuilder(32); // Append date-time if so configured if (showTime) { buf.append(new Date()+" "); } // Append current thread name if so configured if (showThread) { buf.append('['+Thread.currentThread().getName()+"] "); } switch (level) { case TRACE: buf.append("TRACE: "); break; case DEBUG: buf.append("DEBUG: "); break; case INFO: buf.append("INFO: "); break; case WARN: buf.append("WARN: "); break; case ERROR: buf.append("ERROR: "); break; } // Append the message buf.append(message); PrintStream out = level.compareTo(WARN) >= 0 ? System.err : System.out; out.println(buf.toString()); out.flush(); if (t != null) t.printStackTrace(System.err); } }