Out Of My Memory

雨垂れ石を穿つ

cut sort uniq コマンドでApacheのアクセスログ解析

事前準備

今回使用するアクセスログのフォーマット設定

LogFormat "%h %l %u %t \"%r\" %>s %b %D" common
CustomLog "logs/access.log" common

使用するアクセスログの内容

「/node/」というURLへアクセスしまくっているだけ。。。

$ cat access.log  | head
127.0.0.1 - - [17/Dec/2019:11:33:24 +0900] "GET /node/ HTTP/1.1" 200 12 542948
127.0.0.1 - - [17/Dec/2019:11:33:24 +0900] "GET /node/ HTTP/1.1" 200 12 507627
127.0.0.1 - - [17/Dec/2019:11:33:25 +0900] "GET /node/ HTTP/1.1" 200 12 506653
127.0.0.1 - - [17/Dec/2019:11:33:25 +0900] "GET /node/ HTTP/1.1" 200 12 505739
127.0.0.1 - - [17/Dec/2019:11:33:25 +0900] "GET /node/ HTTP/1.1" 200 12 504286
127.0.0.1 - - [17/Dec/2019:11:33:26 +0900] "GET /node/ HTTP/1.1" 200 12 504569
127.0.0.1 - - [17/Dec/2019:11:33:26 +0900] "GET /node/ HTTP/1.1" 200 12 506449
127.0.0.1 - - [17/Dec/2019:11:33:26 +0900] "GET /node/ HTTP/1.1" 200 12 505294
127.0.0.1 - - [17/Dec/2019:11:33:26 +0900] "GET /node/ HTTP/1.1" 200 12 504057
127.0.0.1 - - [17/Dec/2019:11:33:26 +0900] "GET /node/ HTTP/1.1" 200 12 504588

アクセス時間、URL、処理時間を処理時間の昇順ソートで出す

$ cat access.log | cut -d " " -f 4,7,11 | cut -c 14- | sort -n -k3 -t" " | head
11:33:30 /node/ 500859
11:37:02 /node/ 500912
11:36:51 /node/ 500975
11:33:29 /node/ 501027
11:33:27 /node/ 501469
11:37:24 /node/ 501620
11:37:24 /node/ 501669
11:36:54 /node/ 501682
11:39:00 /node/ 501697
11:33:28 /node/ 501722

※headは最初の10行しか表示させないようにするために使用

cut コマンド

  • 「-d」で区切り文字を指定、ここではスペースを指定
  • 「-f」で区切った後、何列目を取り出すか指定、ここでは4,7,11列目を指定
  • 「-c」で前から14文字目以降を表示するようにしている。「[17/Dec/2019:」を削除している

※「-c」オプションのcutコマンドを抜かした場合「[17/Dec/2019:」も出る。

$ cat access.log | cut -d " " -f 4,7,11 | sort -n -k3 -t" " | head -n 3
[17/Dec/2019:11:33:30 /node/ 500859
[17/Dec/2019:11:37:02 /node/ 500912
[17/Dec/2019:11:36:51 /node/ 500975

sortコマンド

  • 「-n」で数値としてソートする
  • 「-t」で区切り文字を指定。「-k」で何列目を基準にソートするかで使用
  • 「-k」でソートするkeyを指定。ここでは3列目の処理時間を基準にソートしている

※降順ソートをしたい場合は「-r」オプションも追加する

1秒ごとにどれだけのアクセスが来たかを表示する

$ cat access.log | cut -d " " -f 4 | cut -c 14- | sort -n | uniq -c | head
      2 11:33:24
      3 11:33:25
      6 11:33:26
      8 11:33:27
      9 11:33:28
     12 11:33:29
     11 11:33:30
     10 11:33:31
     10 11:33:32
     10 11:33:33

cut コマンド

  • 「-d」で区切り文字を指定、ここではスペースを指定
  • 「-f」で区切った後、何列目を取り出すか指定、ここでは4列目を指定
  • 「-c」で前から14文字目以降を表示するようにしている。「[17/Dec/2019:」を削除している

sortコマンド

  • 「-n」で数値としてソートする
  • 1列しか存在しないため区切り文字とソートするkeyは指定していない

uniqコマンド

  • 「-c」で重複した行数を表示している

※必ずソートして順番をそろえてからuniqで重複業を削除する

URLも表示させればどの時間にどのURLへ何アクセス来たかがわかる。

あとがき

どの時間帯にどれだけアクセスが来たか、どの時間帯のどの処理に時間がかかっているか知りたかったときに使用しました。 処理時間を出力するのだけは忘れないように注意。