1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| package com.kongshan.util;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public final class LogUtil { private static final int CALLER_DEPTH = 2; private static final PerformanceMode PERF_MODE = PerformanceMode.AUTO;
private LogUtil() { throw new UnsupportedOperationException("Utility class"); }
public static void trace(String format, Object... args) { log(LogLevel.TRACE, null, format, args); }
public static void debug(String format, Object... args) { log(LogLevel.DEBUG, null, format, args); }
public static void info(String format, Object... args) { log(LogLevel.INFO, null, format, args); }
public static void warn(String format, Object... args) { log(LogLevel.WARN, null, format, args); }
public static void error(String format, Object... args) { error(null, format, args); }
public static void error(Throwable t, String format, Object... args) { log(LogLevel.ERROR, t, format, args); }
private static void log(LogLevel level, Throwable t, String format, Object... args) { final Logger logger = resolveLogger(); if (!logger.isEnabledForLevel(level.toSLF4JLevel())) { return; }
String message = String.format(format, args); switch (level) { case TRACE: logger.trace(message); break; case DEBUG: logger.debug(message); break; case INFO: logger.info(message); break; case WARN: logger.warn(message); break; case ERROR: if (t != null) { logger.error(message, t); } else { logger.error(message); } break; } }
private static Logger resolveLogger() { switch (PERF_MODE) { case AUTO: return getLogger(findCallerClass()); case EXPLICIT: return getLogger(ExplicitContext.getCallerClass()); default: throw new IllegalStateException("Unknown performance mode"); } }
private static Class<?> findCallerClass() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); if (stackTrace.length > CALLER_DEPTH) { try { return Class.forName(stackTrace[CALLER_DEPTH].getClassName()); } catch (ClassNotFoundException e) { } } return LogUtil.class; }
public static Logger getLogger() { return getLogger(findCallerClass()); }
public static Logger getLogger(Class<?> clazz) { return LoggerFactory.getLogger(clazz); }
public static Logger getLogger(String name) { return LoggerFactory.getLogger(name); }
private enum LogLevel { TRACE(org.slf4j.event.Level.TRACE), DEBUG(org.slf4j.event.Level.DEBUG), INFO(org.slf4j.event.Level.INFO), WARN(org.slf4j.event.Level.WARN), ERROR(org.slf4j.event.Level.ERROR);
private final org.slf4j.event.Level level;
LogLevel(org.slf4j.event.Level level) { this.level = level; }
public org.slf4j.event.Level toSLF4JLevel() { return level; } }
public enum PerformanceMode { AUTO, EXPLICIT }
public static class ExplicitContext { private static final ThreadLocal<Class<?>> CALLER_CLASS = new ThreadLocal<>();
public static void setCallerClass(Class<?> clazz) { CALLER_CLASS.set(clazz); }
static Class<?> getCallerClass() { Class<?> clazz = CALLER_CLASS.get(); CALLER_CLASS.remove(); return clazz != null ? clazz : LogUtil.class; } } }
|