Linuxメモ : Rust製のangle-grinderを使ってコマンドラインでログ分析
angle-grinder
Rust製のangle-grinder(コマンド名はagrind
)はコマンドラインでログを分析できるツール。
インストール
README.mdのインストール方法によると、バイナリのダウンロードやcargo
でインストールできる(この時の名前はagrind
ではなくag
)。
$ cargo install ag
ヘルプメッセージ。
$ agrind --help ag 0.13.0 Russell Cohen <russell.r.cohen@gmail.com> CLI App to slice and dice logfiles USAGE: agrind [FLAGS] [OPTIONS] <query|--self-update> FLAGS: -h, --help Prints help information --self-update Update agrind to the latest published version Github (https://github.com/rcoh/angle-grinder) -V, --version Prints version information -v, --verbosity Pass many times for more log output By default, it'll only report errors. Passing `-v` one time also prints warnings, `-vv` enables info logging, `-vvv` debug, and `-vvvv` trace. OPTIONS: -f, --file <file> Optionally reads from a file instead of Stdin -m, --format <format> DEPRECATED. Use -o format=... instead. Provide a Rust std::fmt string to format output -o, --output <output> Set output format. Options: - `json`, - `logfmt` - `format=<rust format string>` (eg. -o format='{src} => {dst}' - `legacy` The original output format, auto aligning [k=v] ARGS: <query> The query For more details + docs, see https://github.com/rcoh/angle-grinder
使い方
ログを分析するツールなのでテスト用のログが必要だが、angle-grindのリポジトリにtests_flies/gen_logs.py
というテスト用のログを生成するスクリプトがあるのでこれを使う。
以下のようにスクリプトを実行するとjson形式のログを生成できる。
$ python -u test_files/gen_logs.py
argind
は以下のようにfilter
とoperator
を組み合わせて分析を行う。
$ agrind '<filter1> [... <filterN>] | operator1 | operator2 | operator3 | ...'
例えば下記コマンドを実行することで、*
すべてのログを対象に、json
形式をパースして、status_code, url
ごとに、count, average(response_ms)
をリアルタイムに集計できる。
$ python -u test_files/gen_logs.py | agrind '* | json | count, average(response_ms) by status_code, url'
Aggregate Operators
集計オペレータとしては下記が使えるとのこと。
- count
- sum
- min
- average
- max
- pXX(percentile)
- sort
- total
- count_distinct
使用例
* | count
* | json | count by status_code
* | json | count, p50(response_ms), p90(response_ms) by status_code
* | json | count as num_requests, p50(response_ms), p90(response_ms) by status_code
* | json | count, p50(response_ms), p90(response_ms), count by status_code >= 400, url