Apacheのアクセスログからステータスコード毎のアクセス数を集計する方法

目次

スポンサードリンク

Apacheのログ形式について

Apacheのアクセスログは以下のような形式で記録されています。アクセス元のIPアドレスに始まり、アクセス日次、リクエストメソッドとURL、ステータスコードなどが並びます。

66.XXX.XXX.XXX - - [23/Apr/2024:03:09:34 +0900] "GET /index.html HTTP/1.1" 200 8176 text/html "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.94 Mobile Safari/537.36 " 38567 11263

Apacheのログにステータスコードを記録する方法

ログの形式はApacheの設定ファイルで定めされており、LogFormat ディレクティブと呼ばれる項目で設定されています。デフォルトでは以下のような設定になっています。

LogFormat "%h %l %u %t \"%r\" %>s %b" commo

この中で ステータスコードを表すのは「%>s」の部分です。当記事では、このステータスコード毎にアクセス数を集計するコマンドを紹介します。

集計コマンドのサンプル

ステータスコード毎のアクセス数は以下コマンドで集計できます。

cat ssl_access_log | awk -F " " '{print $9}'| sort | uniq -c | sort -nr

まず、catコマンドで集計対象のアクセスログを標準出力に出力します。ログの内容を awk コマンドを使い、ステータスコードを表す列のみを抽出します。awk コマンドの -F オプションでは区切り文字を指定することができます。今回は半角スペースを「” “」で表現しています。半角スペースでログを区切り、先頭から9文字目を表示しています。実行してみると、以下のようにステータスコードのみ抽出した結果が表示されます。

[root@hostname logs]$ cat yamamoto-mfg.mvt.jp-access_log | awk -F " " '{print $9}'
200
200
200
200
200
404
404
404
404
302
302
404
200
200

さらに、sortコマンドとuniqコマンドを組み合わせて、ステータスコード毎に出現回数をカウントします。uniqコマンドは -c オプションで、行数をカウントすることができますが、事前に同じ内容は並び様、ソートしておく必要があるため、uniqコマンドの前にsortコマンドを実行しています。以下のような結果になります。

[root@hostname logs]$ cat ssl_access_log | awk -F " " '{print $9}'| sort | uniq -c | sort -nr
 30 200
 27 404
 12 302

最後に、 sort コマンドに -nr オプションをつけて実行することで、出現回数の降順でソートして表示します。 awk -F “ “ ‘{print $9}’ の部分で、ステータスコードの列を指定しましたが、この部分の列数を変更することで、ステータスコード毎やコンテントタイプ毎に集計するなど応用が利きます。


ログ収集〜可視化について学べるおすすめ書籍

Webシステムの基礎について徹底的に学べるUdemy講座
【PHP, MYSQL, Apache】ガチで学びたい人のためのWEB開発の基礎 icon