ApacheのアクセスログからUser-Agent毎のアクセス数を集計する方法

目次

スポンサードリンク

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のログにUser-Agentを記録する方法

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

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

User-Agent文字列をログに記録したい場合は「%{User-Agent}i」を追加する必要があります。 当記事では、User-Agentがログに記録されている前提で、User-Agent毎にアクセス数を集計するコマンドを紹介します。

集計コマンドのサンプル

User-Agent毎のアクセス数は以下コマンドで集計できます。

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

まず、catコマンドで集計対象のアクセスログを標準出力に出力します。ログの内容を awk コマンドを使い、User-Agentの列のみを抽出します。 awk -F \” ‘{print $6}’ の部分で、User-Agentの列番号を指定しています。ログのフォーマットによってこの数値は変わります。コマンドの結果は、以下のようにUser-Agentだけ抽出した結果になります。

[root@hostname logs]# cat ssl_access_log | awk -F \" '{print $6}' | head
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1
Googlebot-Image/1.0
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1

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

[root@hostname logs]# cat ssl_access_log | awk -F \" '{print $6}' | sort | uniq -c | head
  1 Chrome Privacy Preserving Prefetch Proxy
  8 cortex/1.0
  1 facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
  4 facebookexternalhit/1.1;line-poker/1.0
  1 Google/313.0.625856595 CFNetwork/1494.0.7 Darwin/23.4.0
  1 Googlebot/2.1 (+http://www.google.com/bot.html)
154 Googlebot-Image/1.0
  2 LINE/2024.403.931 CFNetwork/1335.0.3.4 Darwin/21.6.0
  3 LINE/2024.403.931 CFNetwork/1494.0.7 Darwin/23.4.0
  1 MobileSafari/604.1 CFNetwork/1240.0.4 Darwin/20.6.0

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


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

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