gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

サーバサイドのログ調査で最近使ったコマンド紹介

f:id:ykira:20201221183110p:plain

こんにちは。ykira(@rakipagu)です。

気がつけば今年も残すところあと10日ほどとなりました。

弊社も年末の繁忙期を乗り越え、なんとか無事に新年を迎えられそうです。

今回はそんな繁忙期にサーバサイドのログ調査や確認で使ったコマンドなどを紹介したいと思います。

私もあれどうするんだっけ?となることが多いので、備忘録も兼ねて……

ちなみにLinux環境でチェックなどを行っていますが

環境によって動作が変わるかもしれませんのでその点はご注意ください。

対象のAPIなどに何回アクセスがあったか確認したい

こんな感じのログがあったとして、

[13/Dec/2020:00:09:59 +0900] "POST getChicken HTTP/1.1" 200 1112

普通に対象名でgrepしてその行数をカウントしてあげればokですね。

grep getChicken access_log | wc -l

もちろん、ここから更に絞り込むことも可能です。

日またぎ 0時0分から0時1分まであったアクセスはこんな感じで取得できます。

grep getChicken access_log | grep "00:00:.." | wc -l

基本的には|パイプでgrepをつなげていけばokです。

ちなみに、日にちが経ってすでに圧縮されてるよってときはzgrepを使いましょう。

zcatとかで出力して|パイプでgrepつなげて〜とかでもokです。

ログの特定のとこだけ抜き出したい

awkを使ってみましょう。

先程と同じこんな感じのログから、最後のレスポンスバイト数だけを出力したいってときは

[13/Dec/2020:00:09:59 +0900] "POST getChicken HTTP/1.1" 200 1112

こんな感じにすれば最後の数字のみ取得できます。

grep getChicken access_log | awk '{print $6}'

awkは何も指定しなければスペースで区切るので、$6だと6番目の値が取得できるってことです。

ちなみに指定文字で区切りたい場合は-Fオプションを使いましょう。

grep getChicken access_log | awk -F'[.]' '{print $6}'

抜き出したとこを加算したりカウントしたりしたい

先程のawkの応用になります。

先程レスポンスバイト数を抜き出しましたが、それを加算するにはこんな感じです。

grep getChicken access_log | awk '{sum+=$6} END {print sum}'

これで合計が取得できます。

すべてカウントするならwc -lで行数カウントでいいのですが

APIごとにカウントしたい場合などはこんな感じです。

cat access_log | awk '{count[$3]++} END {for(i in count) print i, count[i]}'

$3がAPI名ですのでそれのカウントをとっていって、最後にそれを出力しています。

ワンライナーでループしたい

コマンドでforします。

たとえば、0時0分から0時59分まで1分単位のAPIが呼ばれた回数を取得したい場合はこんな感じです。

for i in `seq -w 0 1 59`;do grep getChicken access_log | grep "00:$i:.."  | wc -l ;done

seqで数字の列を出力していますが、こんな感じで組み合わせるとforのループ回数にできます。

;do ~ ;done に実行したいコマンドを入れますが、$iでループ回数を使用することができます。

負荷もそこそこかかると思いますので、本番環境などでの実行は注意しましょう(弊社は保証できかねますー)

最後に

さて簡単ですが、最近使ったコマンドを紹介してみました。

凝り始めるとワンライナーでなんでもやりたくなりますが

「スクリプト書く」とか「出力結果をExcelにコピペして集計」とかのほうが

楽って場合も多いので、過信は禁物です。

また、便利なコマンドがあったら紹介(備忘……)したいと思います。

では、最後まで読んでいただきありがとうございました。