cut sort uniq コマンドでApacheのアクセスログ解析
事前準備
- Apacheのアクセスログのフォーマットに%Dを追加しておく(%Dは処理時間をミリ秒で表す)
- windowsであればgit bashをインスコしておく(git bash経由でlinuxのコマンドが使用できるようになる)
今回使用するアクセスログのフォーマット設定
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へ何アクセス来たかがわかる。
あとがき
どの時間帯にどれだけアクセスが来たか、どの時間帯のどの処理に時間がかかっているか知りたかったときに使用しました。 処理時間を出力するのだけは忘れないように注意。