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
