|
|
|
@ -1,65 +1,265 @@
|
|
|
|
|
package com.taobao.arthas.common;
|
|
|
|
|
|
|
|
|
|
import java.util.logging.Level;
|
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* <pre>
|
|
|
|
|
* FINEST -> TRACE
|
|
|
|
|
* FINER -> DEBUG
|
|
|
|
|
* FINE -> DEBUG
|
|
|
|
|
* CONFIG -> INFO
|
|
|
|
|
* INFO -> INFO
|
|
|
|
|
* WARNING -> WARN
|
|
|
|
|
* SEVERE -> ERROR
|
|
|
|
|
* </pre>
|
|
|
|
|
*
|
|
|
|
|
* @see org.slf4j.bridge.SLF4JBridgeHandler
|
|
|
|
|
* @author hengyunabc 2017-05-03
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public abstract class AnsiLog {
|
|
|
|
|
|
|
|
|
|
static boolean enable = System.console() != null;
|
|
|
|
|
static boolean enableColor;
|
|
|
|
|
|
|
|
|
|
public static java.util.logging.Level LEVEL = java.util.logging.Level.INFO;
|
|
|
|
|
|
|
|
|
|
private static final String RESET = "\033[0m";
|
|
|
|
|
|
|
|
|
|
private static final int DEFAULT = 39;
|
|
|
|
|
private static final int BLACK = 30;
|
|
|
|
|
private static final int RED = 31;
|
|
|
|
|
private static final int GREEN = 32;
|
|
|
|
|
private static final int YELLOW = 33;
|
|
|
|
|
private static final int BLUE = 34;
|
|
|
|
|
private static final int MAGENTA = 35;
|
|
|
|
|
private static final int CYAN = 36;
|
|
|
|
|
private static final int WHITE = 37;
|
|
|
|
|
|
|
|
|
|
private static final String TRACE_PREFIX = "[TRACE] ";
|
|
|
|
|
private static final String TRACE_COLOR_PREFIX = "[" + colorStr("TRACE", GREEN) + "] ";
|
|
|
|
|
|
|
|
|
|
private static final String DEBUG_PREFIX = "[DEBUG] ";
|
|
|
|
|
private static final String DEBUG_COLOR_PREFIX = "[" + colorStr("DEBUG", GREEN) + "] ";
|
|
|
|
|
|
|
|
|
|
private static final String INFO_PREFIX = "[INFO] ";
|
|
|
|
|
private static final String INFO_COLOR_PREFIX = "[" + colorStr("INFO", GREEN) + "] ";
|
|
|
|
|
|
|
|
|
|
private static final String WARN_PREFIX = "[WARN] ";
|
|
|
|
|
private static final String WARN_COLOR_PREFIX = "[" + colorStr("WARN", YELLOW) + "] ";
|
|
|
|
|
|
|
|
|
|
private static final String ERROR_PREFIX = "[ERROR] ";
|
|
|
|
|
private static final String ERROR_COLOR_PREFIX = "[" + colorStr("ERROR", RED) + "] ";
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
|
if (System.console() != null) {
|
|
|
|
|
enableColor = true;
|
|
|
|
|
// under windows, only support cygwin and mingw
|
|
|
|
|
if (OSUtils.isWindows() && !OSUtils.isCygwinOrMinGW()) {
|
|
|
|
|
enableColor = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* set logger Level
|
|
|
|
|
*
|
|
|
|
|
* @param msg
|
|
|
|
|
* @see java.util.logging.Level
|
|
|
|
|
* @param level
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static void red(String msg) {
|
|
|
|
|
if (enable) {
|
|
|
|
|
System.out.println("[31m" + msg + "[0m");
|
|
|
|
|
public static Level level(Level level) {
|
|
|
|
|
Level old = LEVEL;
|
|
|
|
|
LEVEL = level;
|
|
|
|
|
return old;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* get current logger Level
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Level level() {
|
|
|
|
|
return LEVEL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String black(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, BLACK);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String red(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, RED);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String green(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, GREEN);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String yellow(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, YELLOW);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String blue(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, BLUE);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String magenta(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, MAGENTA);
|
|
|
|
|
} else {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String cyan(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, CYAN);
|
|
|
|
|
} else {
|
|
|
|
|
System.err.println(msg);
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void green(String msg) {
|
|
|
|
|
if (enable) {
|
|
|
|
|
System.out.println("[32m" + msg + "[0m");
|
|
|
|
|
public static String white(String msg) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
return colorStr(msg, WHITE);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(msg);
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static String colorStr(String msg, int colorCode) {
|
|
|
|
|
return "\033[" + colorCode + "m" + msg + RESET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void trace(String msg) {
|
|
|
|
|
if (canLog(Level.FINEST)) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
System.out.println(TRACE_COLOR_PREFIX + msg);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(TRACE_PREFIX + msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void trace(String format, Object... arguments) {
|
|
|
|
|
if (canLog(Level.FINEST)) {
|
|
|
|
|
trace(format(format, arguments));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void yellow(String msg) {
|
|
|
|
|
if (enable) {
|
|
|
|
|
System.out.println("[33m" + msg + "[0m");
|
|
|
|
|
public static void trace(Throwable t) {
|
|
|
|
|
if (canLog(Level.FINEST)) {
|
|
|
|
|
t.printStackTrace(System.out);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void debug(String msg) {
|
|
|
|
|
if (canLog(Level.FINER)) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
System.out.println(DEBUG_COLOR_PREFIX + msg);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(msg);
|
|
|
|
|
System.out.println(DEBUG_PREFIX + msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void debug(String format, Object... arguments) {
|
|
|
|
|
if (canLog(Level.FINER)) {
|
|
|
|
|
debug(format(format, arguments));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void debug(Throwable t) {
|
|
|
|
|
if (canLog(Level.FINER)) {
|
|
|
|
|
t.printStackTrace(System.out);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void info(String msg) {
|
|
|
|
|
green(msg);
|
|
|
|
|
if (canLog(Level.CONFIG)) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
System.out.println(INFO_COLOR_PREFIX + msg);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(INFO_PREFIX + msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void info(String format, Object... arguments) {
|
|
|
|
|
green(format(format, arguments));
|
|
|
|
|
if (canLog(Level.CONFIG)) {
|
|
|
|
|
info(format(format, arguments));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void info(Throwable t) {
|
|
|
|
|
if (canLog(Level.CONFIG)) {
|
|
|
|
|
t.printStackTrace(System.out);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void warn(String msg) {
|
|
|
|
|
yellow(msg);
|
|
|
|
|
if (canLog(Level.WARNING)) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
System.out.println(WARN_COLOR_PREFIX + msg);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(WARN_PREFIX + msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void warn(String format, Object... arguments) {
|
|
|
|
|
yellow(format(format, arguments));
|
|
|
|
|
if (canLog(Level.WARNING)) {
|
|
|
|
|
warn(format(format, arguments));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void warn(Throwable t) {
|
|
|
|
|
if (canLog(Level.WARNING)) {
|
|
|
|
|
t.printStackTrace(System.out);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void error(String msg) {
|
|
|
|
|
red(msg);
|
|
|
|
|
if (canLog(Level.SEVERE)) {
|
|
|
|
|
if (enableColor) {
|
|
|
|
|
System.out.println(ERROR_COLOR_PREFIX + msg);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(ERROR_PREFIX + msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void error(String format, Object... arguments) {
|
|
|
|
|
red(format(format, arguments));
|
|
|
|
|
if (canLog(Level.SEVERE)) {
|
|
|
|
|
error(format(format, arguments));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void error(Throwable t) {
|
|
|
|
|
if (canLog(Level.SEVERE)) {
|
|
|
|
|
t.printStackTrace(System.out);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static String format(String from, Object... arguments) {
|
|
|
|
@ -74,4 +274,8 @@ public abstract class AnsiLog {
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static boolean canLog(Level level) {
|
|
|
|
|
return level.intValue() >= LEVEL.intValue();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|