Apache Webサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム) ~JavaScriptが動作しないクローラー、コマンドでのアクセスにも対応したログファイルを用いた集計方法~
Webサーバを運用する上でどのようなIPからどのようなアクセスがあるかを知っておくことは重要な事です。
最近ではGoogleアナリティクスなど高性能なツールでウェブブラウザからのアクセス分析をすることが可能になりましたが、ホスト名・IP毎に詳細に見ていく場合はやはりWebサーバのアクセスログを直接集計することが必要です。
特にJavaScriptが動作しないクローラーやCurl、WgetなどのコマンドでのアクセスはWebサーバのアクセスログを直接参照する必要があります。
今回はクローラーやコマンドなどのウェブブラウザ以外からのアクセスも含んだWebサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム)を備忘録として記載します。
Apache Webサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム) ~JavaScriptが動作しないクローラー、コマンドでのアクセスにも対応したログファイルを用いた集計方法~
基本方針としてはアクセスログファイルのパスに「*」を付けてログローテーションしたファイルも含めて日付指定で集計します。
Apache Webサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム)
引数に整数を入力することで当日から数えて引数の日数前のアクセス数を集計できるようにしています。
集計した結果はアクセス数が少ない順にソーティングして表示しています。
vim check_access_log_count_each_ip.sh
#!/bin/bash
#アクセスログファイルのパス
LOG_PATH=/var/log/httpd/access_log
#引数取得
target=${1}
if [ "${target}" = "" ]; then
#引数がなければ当日を指定
target=0
elif [[ ! "${target}" =~ ^[0-9]*$ ]]; then
#引数があり、整数であれば引数の日数前を指定
target=0
fi
export LANG=en_US.UTF-8
#macOSはgdateコマンドで日付を出力
if [ "$(uname)" == 'Darwin' ]; then
DATECMD=gdate
else
DATECMD=date
fi
#集計対象の日付文字列を作成
APACHE_DATE=`${DATECMD} "+%d/%b/%Y" --date "${target} day ago"`
#アクセスログの日別、ホスト名・IPアドレス毎の集計処理
cat ${LOG_PATH}* | egrep "\[${APACHE_DATE}:" | awk '{print $1}' | sort | uniq -c | sort -n
Apache Webサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム)
引数に1を指定して1日前のアクセスログのホスト名・IPアドレス毎の集計を計算している例です。
実行結果の内容はあくまでサンプルです。
[magtranetwork@localhost ~]# chmod 755 check_access_log_count_each_ip.sh
[magtranetwork@localhost ~]# ./check_access_log_count_each_ip.sh 1
1 0.abc.defgh.ijklm.magtranetwork.net
1 987.654.321.012
2 magtranetwork.com
3 234.567.89.012
3 123-456-789-01a1.bcd2.magtranetwork.com
~省略~
8335 crawl-12-345-678-012.magtranetwork.com
8352 12-345-6-78.aiu.magtranetwork.com
8777 123.456.789.01.ai.magtranetwork.com
9002 345.678.9.01
18833 12.34.567.890.bc.magtranetwork.com
Reference: Tech Blog citing related sources
