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

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

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

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

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

今回の目標はコレをグラフ=ヒストグラムにしてみましょう。まぁさっきの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 での分析方法教えてくださいー><