diff --git a/src/main/java/com/alibaba/druid/support/console/DruidStat.java b/src/main/java/com/alibaba/druid/support/console/DruidStat.java index aca6aa9ccb..0ea33930b3 100644 --- a/src/main/java/com/alibaba/druid/support/console/DruidStat.java +++ b/src/main/java/com/alibaba/druid/support/console/DruidStat.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.support.console; +import java.io.PrintStream; import java.util.ArrayList; import java.io.File; import java.io.IOException; @@ -51,8 +52,7 @@ public class DruidStat { try { opt = Option.parseOptions(args); } catch (OptionParseException e) { - System.out.println(e.getMessage()); - Option.printHelp(); + Option.printHelp(e.getMessage()); return; } @@ -62,6 +62,7 @@ public class DruidStat { @SuppressWarnings("all") public static void printDruidStat(Option option) throws Exception { + PrintStream out = option.getPrintStream(); String address = loadManagementAgentAndGetAddress(option.getPid()); JMXServiceURL jmxUrl = new JMXServiceURL(address); JMXConnector jmxc = JMXConnectorFactory.connect(jmxUrl); @@ -75,7 +76,7 @@ public class DruidStat { if (option.printSqlData()) { List> content = (List>) invokeService(jmxConn, Option.SQL); if (content == null ) { - System.out.println("无SqlStat统计数据,请检查是否已执行了SQL"); + out.println("无SqlStat统计数据,请检查是否已执行了SQL"); } else { TabledDataPrinter.printSqlData(content, option); } @@ -84,7 +85,7 @@ public class DruidStat { if (option.printActiveConn()) { List> content = (List>) invokeService(jmxConn, Option.ACTIVE_CONN); if (content == null || content.size() == 0 ) { - System.out.println("目前无活动中的数据库连接"); + out.println("目前无活动中的数据库连接"); } else { TabledDataPrinter.printActiveConnStack(content, option); } diff --git a/src/main/java/com/alibaba/druid/support/console/Option.java b/src/main/java/com/alibaba/druid/support/console/Option.java index b358f26792..8c93263c7d 100644 --- a/src/main/java/com/alibaba/druid/support/console/Option.java +++ b/src/main/java/com/alibaba/druid/support/console/Option.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.support.console; +import java.io.PrintStream; + public class Option { public static final int DATA_SOURCE = 1 ; @@ -27,6 +29,8 @@ public class Option { private int interval = -1; private boolean detailPrint; + private PrintStream printStream = System.out; + public void addPrintDataType(int newValue) { this.printDataType= this.printDataType | newValue; } @@ -140,41 +144,53 @@ public class Option { return option; } + public static void printHelp(String errorMsg) { + printHelp(System.out, errorMsg); + } + public static void printHelp() { - System.out.println("Usage: druidStat -help | -sql -ds -act [-detail] [-id id] [refresh-interval]"); - System.out.println(); - System.out.println("参数: "); - System.out.println(" -help 打印此帮助信息"); - System.out.println(" -sql 打印SQL统计数据"); - System.out.println(" -ds 打印DataSource统计数据"); - System.out.println(" -act 打印活动连接的堆栈信息"); - System.out.println(" -detail 打印统计数据的全部字段信息"); - System.out.println(" -id id 要打印的数据的具体id值" ); - System.out.println(" pid 使用druid连接池的jvm进程id"); - System.out.println(" refresh-interval 自动刷新时间间隔, 以秒为单位" ); + printHelp(System.out, null); + } - System.out.println(); - System.out.println("说明: "); - System.out.println(" -sql,-ds,-act参数中要至少指定一种数据进行打印, 可以"); - System.out.println(" 组合使用, 比如 -sql -ds 一起的话就打印两种统计数据"); - System.out.println(" -id id可以跟 -sql 或-ds组合, 比如 -sql -id 5 或 -ds -id 1086752"); - System.out.println(" pid必需指定, refresh-interval可选, 如不指定,则打印数据后退出"); - System.out.println(" pid和refresh-interval参数必需放在命令行的最后, 否则解析会出错"); + public static void printHelp(PrintStream out, String errorMsg) { + if (errorMsg != null ) { + out.println(errorMsg); + out.println(); + } + out.println("Usage: druidStat -help | -sql -ds -act [-detail] [-id id] [refresh-interval]"); + out.println(); + out.println("参数: "); + out.println(" -help 打印此帮助信息"); + out.println(" -sql 打印SQL统计数据"); + out.println(" -ds 打印DataSource统计数据"); + out.println(" -act 打印活动连接的堆栈信息"); + out.println(" -detail 打印统计数据的全部字段信息"); + out.println(" -id id 要打印的数据的具体id值" ); + out.println(" pid 使用druid连接池的jvm进程id"); + out.println(" refresh-interval 自动刷新时间间隔, 以秒为单位" ); - System.out.println(); - System.out.println("例子: "); - System.out.println(" 打印3983进程的sql 统计数据."); - System.out.println(" >druidStat -sql 3983"); - System.out.println(" 打印3983进程的ds统计数据."); - System.out.println(" >druidStat -ds 3983"); - System.out.println(" 打印3983进程的sql的id为10的详细统计数据."); - System.out.println(" >druidStat -sql -id 10 -detail 3983"); - System.out.println(" 打印3983进程的当前活动连接的堆栈信息"); - System.out.println(" >druidStat -act 3983"); - System.out.println(" 打印3983进程的ds,sql,和act信息"); - System.out.println(" >druidStat -ds -sql -act 3983"); - System.out.println(" 每隔5秒自动打印ds统计数据"); - System.out.println(" >druidStat -ds 3983 5"); + out.println(); + out.println("说明: "); + out.println(" -sql,-ds,-act参数中要至少指定一种数据进行打印, 可以"); + out.println(" 组合使用, 比如 -sql -ds 一起的话就打印两种统计数据"); + out.println(" -id id可以跟 -sql 或-ds组合, 比如 -sql -id 5 或 -ds -id 1086752"); + out.println(" pid必需指定, refresh-interval可选, 如不指定,则打印数据后退出"); + out.println(" pid和refresh-interval参数必需放在命令行的最后, 否则解析会出错"); + + out.println(); + out.println("例子: "); + out.println(" 打印3983进程的sql 统计数据."); + out.println(" >druidStat -sql 3983"); + out.println(" 打印3983进程的ds统计数据."); + out.println(" >druidStat -ds 3983"); + out.println(" 打印3983进程的sql的id为10的详细统计数据."); + out.println(" >druidStat -sql -id 10 -detail 3983"); + out.println(" 打印3983进程的当前活动连接的堆栈信息"); + out.println(" >druidStat -act 3983"); + out.println(" 打印3983进程的ds,sql,和act信息"); + out.println(" >druidStat -ds -sql -act 3983"); + out.println(" 每隔5秒自动打印ds统计数据"); + out.println(" >druidStat -ds 3983 5"); } public int getId() { @@ -199,4 +215,12 @@ public class Option { return this.interval; } + + public void setPrintStream(PrintStream printStream) { + this.printStream=printStream; + } + public PrintStream getPrintStream() { + return this.printStream; + } + } diff --git a/src/main/java/com/alibaba/druid/support/console/TableFormatter.java b/src/main/java/com/alibaba/druid/support/console/TableFormatter.java index 725c4515bd..91008db602 100644 --- a/src/main/java/com/alibaba/druid/support/console/TableFormatter.java +++ b/src/main/java/com/alibaba/druid/support/console/TableFormatter.java @@ -83,13 +83,4 @@ public class TableFormatter { return sb.toString(); } - public static void main(String[] args) { - List v = new ArrayList(); - v.add(new String[]{"name","age","addr"}); - v.add(new String[]{"shrek", "200", "hangzhou zhejiang "}); - v.add(new String[]{"what as", "11", "asdfa"}); - String formattedStr = format(v); - System.out.println(formattedStr); - } - } diff --git a/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java b/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java index 4ca6cd3faf..aeda7b7041 100644 --- a/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java +++ b/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.support.console; +import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -59,11 +60,12 @@ public class TabledDataPrinter { "TransactionHistogram", "ConnectionHoldTimeHistogram", "RemoveAbandoned", "ClobOpenCount" }; public static void printActiveConnStack(List> content, Option opt) { + PrintStream out = opt.getPrintStream(); for (List stack : content) { for (String line : stack) { - System.out.println(line); + out.println(line); } - System.out.println("===============================\n"); + out.println("===============================\n"); } } @@ -83,6 +85,7 @@ public class TabledDataPrinter { } public static void _printDataSourceData(List> content, Option opt) { + PrintStream out = opt.getPrintStream(); if (opt.getId() != -1) { List> matchedContent = new ArrayList>(); for (Map dsStat : content) { @@ -95,9 +98,9 @@ public class TabledDataPrinter { content = matchedContent; } if (opt.isDetailPrint()) { - System.out.println(getVerticalFormattedOutput(content, dsColField)); + out.println(getVerticalFormattedOutput(content, dsColField)); } else { - System.out.println(getFormattedOutput(content, dsRowTitle, dsRowField)); + out.println(getFormattedOutput(content, dsRowTitle, dsRowField)); } } @@ -117,6 +120,8 @@ public class TabledDataPrinter { } public static void _printSqlData(List> content, Option opt) { + + PrintStream out = opt.getPrintStream(); if (opt.getId() != -1) { List> matchedContent = new ArrayList>(); for (Map sqlStat : content) { @@ -126,9 +131,9 @@ public class TabledDataPrinter { if (opt.isDetailPrint()) { String dbType = (String) sqlStat.get("DbType"); String sql = (String) sqlStat.get("SQL"); - System.out.println("Formatted SQL:"); - System.out.println(SQLUtils.format(sql, dbType)); - System.out.println(); + out.println("Formatted SQL:"); + out.println(SQLUtils.format(sql, dbType)); + out.println(); } break; } @@ -136,9 +141,9 @@ public class TabledDataPrinter { content = matchedContent; } if (opt.isDetailPrint()) { - System.out.println(getVerticalFormattedOutput(content, sqlColField)); + out.println(getVerticalFormattedOutput(content, sqlColField)); } else { - System.out.println(getFormattedOutput(content, sqlRowTitle, sqlRowField)); + out.println(getFormattedOutput(content, sqlRowTitle, sqlRowField)); } }