From 8d32e691c954a4055d1b566e005695745da3b113 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 9 Nov 2018 19:39:40 +0800 Subject: [PATCH] refactor AnsiLog --- .../com/taobao/arthas/boot/DownloadUtils.java | 2 + .../com/taobao/arthas/boot/ProcessUtils.java | 1 + .../com/taobao/arthas/common/AnsiLog.java | 244 ++++++++++++++++-- .../arthas/common/ExecutingCommand.java | 19 +- .../com/taobao/arthas/common}/IOUtils.java | 2 +- 5 files changed, 236 insertions(+), 32 deletions(-) rename {boot/src/main/java/com/taobao/arthas/boot => common/src/main/java/com/taobao/arthas/common}/IOUtils.java (99%) 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("" + msg + ""); + 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("" + msg + ""); + 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("" + msg + ""); + 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(0); } catch (IOException 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(0); } @@ -68,10 +63,12 @@ public class ExecutingCommand { } p.waitFor(); } catch (IOException e) { - LOG.trace("Problem reading output from {}: {}", Arrays.toString(cmdToRunWithArgs), e); + AnsiLog.trace("Problem reading output from {}:", Arrays.toString(cmdToRunWithArgs)); + AnsiLog.trace(e); return new ArrayList(0); } catch (InterruptedException ie) { - LOG.trace("Interrupted while reading output from {}: {}", Arrays.toString(cmdToRunWithArgs), ie); + AnsiLog.trace("Problem reading output from {}:", Arrays.toString(cmdToRunWithArgs)); + AnsiLog.trace(ie); Thread.currentThread().interrupt(); } finally { IOUtils.close(reader); diff --git a/boot/src/main/java/com/taobao/arthas/boot/IOUtils.java b/common/src/main/java/com/taobao/arthas/common/IOUtils.java similarity index 99% rename from boot/src/main/java/com/taobao/arthas/boot/IOUtils.java rename to common/src/main/java/com/taobao/arthas/common/IOUtils.java index 7cd612388..a68ae9737 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/IOUtils.java +++ b/common/src/main/java/com/taobao/arthas/common/IOUtils.java @@ -1,4 +1,4 @@ -package com.taobao.arthas.boot; +package com.taobao.arthas.common; import java.io.BufferedInputStream; import java.io.BufferedOutputStream;