サーバーメモ。
アクセス数がたくさんあった場合の話。
access_logが1日で4GBを超えるくらいからを想定してます。
お金がなくてお高いサーバー代を出せない場合、access_logを解析するのも一苦労です。
Google Analyticsが使えるケースはとても楽チンですが、そうでないケースもあります。また、無料のAWStatsやwebalizerだと欲しい情報だけ取れなかったり、そもそもサーバー負荷が高いので別のサーバーで解析させなきゃだったり。
というか、webalizerはメモリ使いすぎで落ちちゃうなんてこともあります。古いし解析後の情報も見にくいしダメツールです。たくさんの無料レンタルサーバーで採用されてますが。クソです。アクセス数が少ない場合には良いのですが。
というわけで、お金も無いしサーバー増やせないし、クライアントは○月×日のリファラ欲しいとか言ってくるし、いざって時のためのコマンドです。もちろん、access_logにリファラを出力してないって場合はapacheの設定から変えなければ出来ませんので、そこは出力されているとして。
まずはメモリサイズ的に1つのaccess_logを読み込めない時のため、ファイルの分割と結合。
■分割
split -b 2000m access_log access_log.
■結合
cat access_log.* > access_log
これで、access_logのファイルを1つ2000MB=2GBに分けます。ログローテーションで最初から指定しとくのもアリです。
次に、日付での抽出。
■抽出
grep '4\/Jul\/2013' access_log.aa > day20130704.log
■別の抽出例(2013/7/6の10時〜17時)
grep -e '6\/Jul\/2013:1[0-7]' access_log.aa > day20130706_10-17.log
という感じで、お好みの日付や期間だけ取り出します。分割したログに対して抽出を行い、抽出したファイルは結合の方法で一つのファイルにまとめます。それで、特定日のみのaccess_logが出来上がります。
リファラの取得にはawkを使います。こいつはハイパー便利な機能で、本が一冊書けるくらいイロイロ出来ます。今回はシンプルな使い方のみ。便利な分オーバーヘッドもでかいですが、やっぱ便利なので使います。
■リファラの取得
cat day20130704.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -n 100 > ref20130704.log
awkの「print $11」は、1行毎の処理で、スペースを区切りとして、11個目の文字列を出力してくれます。11個目がリファラでは無い場合は、適時変更します。
他にもイロイロな使い方が出来て、例えば時間帯別にアクセス数を出力したい場合は以下の様なコマンドになります。
■時間別のアクセス数
cat day20130704.log | awk '{ split($4,a,":"); print a[2];}' | sort | uniq -c > put.log
awkのsplitは文字列の分割です。
split(元の文字列,出力変数,区切り文字)
出力変数は、配列になります。
awkの{から}で;を入れて、splitとprintの2つの命令を書いてますね。
print a[2]は、変数aの3個目([0]が1個目)の値を出力してます。
sortは昇順で並び替え。uniq -cは重複行のカウントです。重複は連続した行しか判定してくれないので、uniqの前にソートしてるのです。
他、特に説明無くすっ飛ばしたものは以下の通り。
■数値的に降順ソート
sort -nr
■上位100行を出力
head -n 100
■ファイル内容を出力
cat ファイル名
ちなみに、「|」で区切ると、左から順番に実行してくれます。
「>」は、結果をファイルに出力してます。
「*」は、ワイルドカードといって、全ての文字に置き換わってくれます。
例えば、以下のファイルがあったとして、
access_log.1
access_log.2
access_log.3
これらのファイルを結合したい場合、
cat access_log.1 access_log.2 access_log.3 > access_log.all
と
cat access_log.* > access_log.all
は一緒です。
とまぁ、ちょっとしたことならコマンドのほうが楽なので、ツールに頼れない場合には使ってみて下さい。
- 関連記事
-