diff --git a/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java b/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java index 54a93faa0..ff8a20e78 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java +++ b/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java @@ -18,6 +18,8 @@ import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import com.taobao.arthas.common.IOUtils; + /** * * @author hengyunabc 2018-11-06 diff --git a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java index 8252dbb9d..03d47d888 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java +++ b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java @@ -17,6 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.taobao.arthas.common.ExecutingCommand; +import com.taobao.arthas.common.IOUtils; /** * diff --git a/common/src/main/java/com/taobao/arthas/common/AnsiLog.java b/common/src/main/java/com/taobao/arthas/common/AnsiLog.java index c441feafe..5e1821b3b 100644 --- a/common/src/main/java/com/taobao/arthas/common/AnsiLog.java +++ b/common/src/main/java/com/taobao/arthas/common/AnsiLog.java @@ -1,65 +1,265 @@ package com.taobao.arthas.common; + +import java.util.logging.Level; import java.util.regex.Matcher; /** * + *
+ * FINEST -> TRACE + * FINER -> DEBUG + * FINE -> DEBUG + * CONFIG -> INFO + * INFO -> INFO + * WARNING -> WARN + * SEVERE -> ERROR + *+ * + * @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 + * + * @see java.util.logging.Level + * @param level + * @return + */ + public static Level level(Level level) { + Level old = LEVEL; + LEVEL = level; + return old; + } /** + * get current logger Level * - * @param msg + * @return */ - public static void red(String msg) { - if (enable) { - System.out.println("[31m" + msg + "[0m"); + public static Level level() { + return LEVEL; + } + + public static String black(String msg) { + if (enableColor) { + return colorStr(msg, BLACK); } else { - System.err.println(msg); + return msg; } } - public static void green(String msg) { - if (enable) { - System.out.println("[32m" + msg + "[0m"); + public static String red(String msg) { + if (enableColor) { + return colorStr(msg, RED); } else { - System.out.println(msg); + return msg; } } - public static void yellow(String msg) { - if (enable) { - System.out.println("[33m" + msg + "[0m"); + public static String green(String msg) { + if (enableColor) { + return colorStr(msg, GREEN); } else { - System.out.println(msg); + 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 { + return msg; + } + } + + public static String white(String msg) { + if (enableColor) { + return colorStr(msg, WHITE); + } else { + 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 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(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(); + } } diff --git a/common/src/main/java/com/taobao/arthas/common/ExecutingCommand.java b/common/src/main/java/com/taobao/arthas/common/ExecutingCommand.java index a17ea2fd7..3bf1c20ce 100644 --- a/common/src/main/java/com/taobao/arthas/common/ExecutingCommand.java +++ b/common/src/main/java/com/taobao/arthas/common/ExecutingCommand.java @@ -7,11 +7,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.taobao.arthas.boot.IOUtils; - /** * A class for executing on the command line and returning the result of * execution. @@ -20,8 +15,6 @@ import com.taobao.arthas.boot.IOUtils; */ public class ExecutingCommand { - private static final Logger LOG = LoggerFactory.getLogger(ExecutingCommand.class); - private ExecutingCommand() { } @@ -52,10 +45,12 @@ public class ExecutingCommand { try { p = Runtime.getRuntime().exec(cmdToRunWithArgs); } catch (SecurityException e) { - LOG.trace("Couldn't run command {}: {}", Arrays.toString(cmdToRunWithArgs), e); + AnsiLog.trace("Couldn't run command {}:", Arrays.toString(cmdToRunWithArgs)); + AnsiLog.trace(e); return new ArrayList