package openeye; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public final class Log { private Log() {} private static final Logger logger; static { logger = LogManager.getLogger("OpenEye"); } private static final Throwable stackInfo = new Throwable(); private static String getLogLocation(Throwable t) { // first element is always log function // maybe faster but definitely unsafe implementation: // JavaLangAccess access = SharedSecrets.getJavaLangAccess(); // if (access.getStackTraceDepth(t) < 2) return ""; // final StackTraceElement caller = access.getStackTraceElement(t, 1); final StackTraceElement[] stack = t.getStackTrace(); if (stack.length < 2) return ""; final StackTraceElement caller = stack[1]; return caller.getClassName() + "." + caller.getMethodName() + "(" + caller.getFileName() + ":" + caller.getLineNumber() + "): "; } private static void logWithCaller(Throwable callerStack, Level level, String format, Object... data) { logger.log(level, getLogLocation(callerStack) + String.format(format, data)); } public static void log(Level level, String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), level, format, data); } public static void severe(String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), Level.ERROR, format, data); } public static void warn(String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), Level.WARN, format, data); } public static void info(String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), Level.INFO, format, data); } public static void debug(String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), Level.DEBUG, format, data); } public static void trace(String format, Object... data) { logWithCaller(stackInfo.fillInStackTrace(), Level.TRACE, format, data); } public static void log(Level level, Throwable ex, String format, Object... data) { logger.log(level, String.format(format, data), ex); } public static void severe(Throwable ex, String format, Object... data) { log(Level.ERROR, ex, format, data); } public static void warn(Throwable ex, String format, Object... data) { log(Level.WARN, ex, format, data); } public static void info(Throwable ex, String format, Object... data) { log(Level.INFO, ex, format, data); } }