RStudio使ってApacheのアクセスログをグラフにしてみよう
最近個人的にやっと R のブームが来ています。2009 年に Tsukuba.R に参加して gfx さんの前で Perl の話をするという謎のイベントをこなして以来、「そろそろ R 使うか」と言い続けてはや 2 年。ついに遅れたマイブームがやってきました。
さて、今回やってみたのは前回入れてみたサーバ版の RStudio を使って、Apache のアクセスログを何らかグラフにしてみたという内容になります。凝ったことしようとしたんですが、そもそも R がよく分からなかったのでとりあえずできた最低限の話と、いくつか BK 的なものを。間違ってたら教えてくだしあ><
今回の目標=アクセスログの 1 時間毎のヒストグラムをグラフにする
とりあえずということで、こういうグラフを作ることを目標にしましょう。数値だけであれば以前紹介したコマンドラインで十分でこんな感じ。
-
参考:突然の Twitter 砲にもなんとか耐えたさくら VPS に感謝する – As a Futurist…
cat /etc/httpd/logs/access_log.20110305 | cut -f2 -d: | sort | uniq -c 1234 00 5678 01 9012 02 3456 03 …
今回の目標はコレをグラフ=ヒストグラムにしてみましょう。まぁさっきのcut | sort | uniq -c
の結果を Excel にコピペしてグラフにすればいいだけなんですが、プログラマたる者なんでもコマンドでやりたいですよね!ね?
RStudio サーバ版
デスクトップにアクセスログをコピーしてきてやってもいいんですが、せっかくならそのままサーバで動かしてみましょう。インストールは Ubuntu/CentOS あたりなら楽チンなので、とりあえず入れてみてくださいな。
【若干修正】 epel だけじゃパッケージ足りなかったです><
# yum --enablerepo=epel install R
# wget https://s3.amazonaws.com/rstudio-server/rstudio-server-0.92.44-x86_64.rpm
# rpm -Uvh rstudio-server-0.92.44-x86_64.rpm
rpm ならすでにサーバ上がっているので、ブラウザから 8787 ポートにアクセスして、Linux のユーザアカウントでログインしましょう。
locale を英語にしておこう
僕がハマったのは、あとで日付の変換をするんですが、その際にサーバの locale が日本語になってたので、月の名前が日本語(3 月)になってしまった点でした。Apache のログは英語(Mar)で書かれているので、R の locale を変更しておきます。
> Sys.setlocale("LC_ALL", "en_US.UTF-8")
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=ja_JP.UTF-8;LC_PAPER=ja_JP.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=ja_JP.UTF-8;LC_IDENTIFICATION=C"
デスクトップ版でも locale の問題はあるかも
ちなみに、デスクトップ版で日本語が化ける的なやつは、同じように locale を UTF-8 にしてあげれば解決しました。
> a <- "あああ"
> a
[1] "\343\201\202\343\201\202\343\201\202"
> Sys.setlocale("LC_ALL", "en_US.UTF-8")
[1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/C"
> b <- "あああ"
> b
[1] "あああ"
Apache のアクセスログをまるっとデータフレームに読み込もう
R は行列みたいなデータを扱うのが得意で、そのひとつにデータフレームというのがあります。色んな要素を行列みたいにつっこめて、まさに RDB でいうテーブルみたいな感じにできます。そこで、Apache のアクセスログをそのままそこに突っ込んでみましょう。アクセスログは combined 形式+最後のカラムに%D を入れてると仮定します。
> d <- read.table("/etc/httpd/logs/access_log.20110305", quote="\"", fill = TRUE)
なんて簡単な!combined のログって、UA とかの部分に空白が入ったりして awk とかでも結構面倒だなぁと思ってたのですが、quote というオプションで"
を指定してあげると、囲まれてる部分を 1 つのカラムに突っ込んでくれました。日付の部分のタイムゾーンは別カラムになっちゃってますが、まぁ大した影響ないので無視で。
RStudio の場合こんな感じでデータの中身を簡単に確認できるので初心者にやさしいですね。
日付時刻を変換しよう
先程読み込んだデータフレームは V4 カラムに日付時刻っぽいものが入ってるんですが、見づらいですね。とりあえずこれを R の日付時刻オブジェクト経由で「時= hour」だけにしたカラムを追加してみましょう。
> d$V12 <- format(strptime(d$V4, "[%d/%b/%Y:%H:%M:%S"), "%H")
strptime
関数でパースして、format
関数で「時」だけにしたものを V12 カラムに突っ込んでいます。こういうのをループ書かずにやれるのは R ならではですね。
グラフにしてみよう
では最後、ggplot2 を使って見た目のかっこいいグラフにしてみましょう。入ってなければインストール。
> install.packages("ggplot2")
> library("ggplot2")
> qplot(V12, data = d, geom = "histogram")
キターーーーーーーー!やほーーーーーーーーーーーー
おわりに
これぐらいだったらわざわざ R 使わなくていいだろというツッコミは置いといて、もうちょっと勉強すれば色々分析に使えそうですねー。アクセスログに限らず様々なログを食わせてぱっとグラフにしてトラブルシューティングとかに使える様になれば、きっと映画に出てくるハッカー的なあれになれますよ!
ではではー。誰か R での分析方法教えてくださいー><