Linux:Java:JMeterのログの日付を変換して出力するサンプル の変更点
Top / Linux:Java:JMeterのログの日付を変換して出力するサンプル
- 追加された行はこの色です。
- 削除された行はこの色です。
- Linux:Java:JMeterのログの日付を変換して出力するサンプル へ行く。
- Linux:Java:JMeterのログの日付を変換して出力するサンプル の差分を削除
[[Linux:Java:標準入力を受けて標準出力に出す]] *Linux:Java:JMeterのログの日付を変換して出力するサンプル [#v1939661] JMeterのログを標準入力から受けて、日付フォーマットに直して標準出力に出力するサンプルです。 日付の変換は以下の3種類を行っています。 -時分秒まで出力 -時分まで出力 -時まで出力 たいがい、JMeterログって、少なくとも万行単位で出力され、多いときは千万行単位で出たりします。 ※今回、高負荷試験をJMeterで実施したところ、csvが1700万行出力されたりw そういう場合に、Excelで集計することが不可能なので、この結果をSQLITEか何かに突っ込んで解析したりすると幸せになれますw ***ソースコード [#je803930] こちらの記事のソースをベースにしてます。 -[[Linux:Java:標準入力を受けて標準出力に出す]] こんな感じです。 import java.io.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class JmeterDateParser { public static void main(String[] args) { try { // 標準入力を設定 BufferedReader bin = new BufferedReader(new InputStreamReader( System.in)); String line = null; JmeterDateParser parser = new JmeterDateParser(); // 標準入力からの1行入力を待つ。 while ((line = bin.readLine()) != null) { System.out.print(parser.process(line)); } bin.close(); } catch (Exception e) { e.printStackTrace(); // プログラムを終了 System.exit(255); } } private final DateFormat df = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); private Calendar ca = null; private final String SEPARATOR = "\t"; private final String RET_CODE = "\n"; public JmeterDateParser() { ca = Calendar.getInstance(); } // JMeterの結果レポートのcsvを読み込み、日付フォーマットを直す。 public String process(String line) { String col[] = line.split(","); // 10カラムでないレコードは無視する。 if (col.length != 10) { return ""; } // 第一カラムがlongにパース出来ないレコードは無視する。 long milisec; try { milisec = Long.parseLong(col[0]); } catch (Exception e) { return ""; } // 日付に変換し、返却する。 ca.setTimeInMillis(milisec); StringBuffer res = new StringBuffer(); String target = df.format(ca.getTime()); // 秒まで変換した値を出力 res.append(target); // 分まで変換した値を出力 res.append(SEPARATOR).append(target.substring(0, 16)); // 時まで変換した値を出力 res.append(SEPARATOR).append(target.substring(0, 13)); for (int i = 1; i < col.length; i++) { res.append(SEPARATOR).append(col[i]); } return res.append(RET_CODE).toString(); } } 元々のデータはカンマ「,」区切りですが、出力は「タブ」区切りで出してます。 なぜこうするかって?それは好みの問題ですw ***実行例 [#f119e4e1] まず、インプットとなるJMeterの実行結果、「XXX.csv」はこんな感じです。 1385389721715,120,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,120 1385389721720,118,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,118 1385389721838,122,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,122 1385389721841,124,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,123 1385389721963,108,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,107 1385389721968,113,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,113 こんな感じ実行します。 cat XXXX.csv | java JmeterDateParser 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 120 サンプル_1 200 OK サンプル_スレッド10 1-1 text true 7273 120 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 118 サンプル_2 200 OK サンプル_スレッド10 1-2 text true 7273 118 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 122 サンプル_1 200 OK サンプル_スレッド10 1-1 text true 7273 122 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 124 サンプル_2 200 OK サンプル_スレッド10 1-2 text true 7273 123 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 108 サンプル_1 200 OK サンプル_スレッド10 1-1 text true 7273 107 2013-11-25 23:28:41 2013-11-25 23:28 2013-11-25 23 113 サンプル_2 200 OK サンプル_スレッド10 1-2 text true 7273 113 これをSQLITEに突っ込んで、1カラム目、2カラム目、3カラム目にインデックスを貼れば、秒ごと、分ごと、時間ごとのログの集計が簡単にできます。