Apache ログ解析 URLの出現回数を数える


やりたいこと

Apacheのログから各URLの出現回数を数えたい
ログが分析環境などに入ってなく、サーバから3ヶ月分のログを取得して実施
割と地道にやっていくしかないが、同じような作業が発生した際の参考にしてもらえれば。

・アクセスログ(1ファイル およそ100万行 x 90)
IPアドレス、日付、リクエスト、リファラーがある
この中のURLリクエストの数を数えたい (以下の /TEST/xxx/xxxxxx/)

access.log
111.11.1.111 - - [25/Dec/2020:00:00:00 +0900] "GET /TEST/xxx/xxxxxx/ HTTP/1.1" 200 12364 "https://xxxx" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 54089

方法

調べると、apachelogを読み込むツールなどもあるみたいだが、今回はシンプルにコマンドで頑張ってみる。
sedコマンドを利用して不要な部分を取り除いていくだけ。

1.URLだけ出力できるようにsedコマンドの置換で頑張る

cat access.log | sed -e "s/.*\] \"//" | sed -e "s/ HTTP.*$//" | sed -e "s/POST //" | sed -e "s/GET //"

(accesslogがgz形式などで圧縮されているときは、解凍せずにgzcatで出力するとローカルのディスク容量も安心。)

2.1.が目的の形でできるようになったらそれをファイルに出力する

cat access.log | sed -e "s/.*\] \"//" | sed -e "s/ HTTP.*$//" | sed -e "s/POST //" | sed -e "s/GET //" > out.txt

3.件数を数える

cat out.txt | awk '{count[$0]++}END{for(i in count)print count[i], i}'

awkを利用してgroup byのような感じで検索できる
https://qiita.com/oshiro/items/11b6833aa41627723059

上記はコマンドの例だが、90日分のファイルでまぁまぁでかいので、その後さらに踏み込んだ調査などをしたいケースを踏まえるとHIVEやRedshiftなどのデータウェアハウスの環境があるのであればそこにImportすると良い。