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開発の基礎
Search
Recent Posts
- OpenSSHのエラー「bad ownership or modes for chroot directory component」の原因と解消方法
- Apacheの起動状態をチェックして停止してる場合にApacheを起動するシェルスクリプト
- Amazon LinuxのOSバージョンを調べる方法|/etc/redhat-release の代替ファイル
- MYSQLでダンプファイルを取得する際に発生したエラー「Couldn't execute 'SELECT BINLOG_GTID_POS('', '0')': You are not using binary logging (1381)」の原因と対処方法
- RHEL系Linuxでリポジトリを一覧表示するコマンド(dnf repolist)