現在、アプリケーションのパフォーマンスを分析しています。まず、アプリケーションによって生成されたログを確認して実行するのに許容されるよりも長い時間がかかるビジネスロジックジョブを識別します。
ログファイルの一部は次のとおりです。
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
私の要件は、各タスクの実行に費やされた合計時間を見つけることです。たとえば、xmlRecord 35165のタスク2の所要時間= xmlRecord 35165のタスク2の終了時間 - xmlRecord 35165のタスク1の終了時間です。
だから、私は次のように同じxmlRecord IDを持つすべてのログステートメントをグループ化する方法を望んでいます。
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
上記のようにすべてのログステートメントをグループ化できる場合、Task2はxmlRecord 35165を処理するのに17分かかりました。
ここに示されているログは、私のアプリケーションから印刷された正確なログではなく、単なる例です。特定のXML IDのログが常に順番に表示されるように、すべてのログステートメントをグループ化できるようにしたいです。
私はシェルに少し錆びていて、誰かが車輪を再発明するのに時間を無駄にしないように、すでにこれを行うライナーやスクリプトを教えてくれたら幸いです。
答え1
初心者として列を基準にソートしてみてはいかがでしょうかxmlRecord Id
? :-
sort -k 9 -o <out.log> <in.log>
番号順にグループ化する必要があります。それも並べ替えたい場合は、スクリプトなどを含めることTask
ができます。awk
どのように動作しますか?
このsort
コマンドはさまざまな方法でデータをソートできます。この場合、列9の値に基づいてソートします。特に明記しない限り、標準の英数字ソートを使用します。
.... -k 9 ....
例の他のパラメータは、使用する入力ファイル(ログファイル)と結果を-o <out.log>
。
答え2
ファイル全体をロードするのに十分なメモリがある場合は、次のことを試してください。
$ perl -ane '
push @h, [$F[1],(split(/:/,$F[8]))[1],$_];
END {
print map { $_->[2] }
sort { $b->[1] <=> $a->[1]
||
$a->[0] cmp $b->[0]
}
@h;
}
' file
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
説明する
@h
ファイルを処理するときに、各要素が配列参照である配列を作成します。各配列参照には3つの要素が含まれています。- 時間はログファイルに表示されます。
18:03:20,269
- XMLレコードID
- 完全ログエントリ
- 時間はログファイルに表示されます。
最後に、次の条件で結果を印刷します。
- XMLレコードIDに基づいて最初にソートするか、
$b->[1] <=> $a->[1]
その逆にソート - IDが同じ場合は、ログに表示される時間に基づいて比較します。
$a->[0] cmp $b->[0]
- XMLレコードIDに基づいて最初にソートするか、