RStudio使ってApacheのアクセスログをグラフにしてみよう

最近個人的にやっとRのブームが来ています。2009年にTsukuba.Rに参加してgfxさんの前でPerlの話をするという謎のイベントをこなして以来、「そろそろR使うか」と言い続けてはや2年。ついに遅れたマイブームがやってきました。

さて、今回やってみたのは前回入れてみたサーバ版のRStudioを使って、Apacheのアクセスログを何らかグラフにしてみたという内容になります。凝ったことしようとしたんですが、そもそもRがよく分からなかったのでとりあえずできた最低限の話と、いくつかBK的なものを。間違ってたら教えてくだしあ><

今回の目標=アクセスログの1時間毎のヒストグラムをグラフにする

とりあえずということで、こういうグラフを作ることを目標にしましょう。数値だけであれば以前紹介したコマンドラインで十分でこんな感じ。

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の場合こんな感じでデータの中身を簡単に確認できるので初心者にやさしいですね。

rstudio1

日付時刻を変換しよう

先程読み込んだデータフレームは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")

rstudio2

キターーーーーーーー!やほーーーーーーーーーーーー

おわりに

これぐらいだったらわざわざR使わなくていいだろというツッコミは置いといて、もうちょっと勉強すれば色々分析に使えそうですねー。アクセスログに限らず様々なログを食わせてぱっとグラフにしてトラブルシューティングとかに使える様になれば、きっと映画に出てくるハッカー的なあれになれますよ!

ではではー。誰かRでの分析方法教えてくださいー><