catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

pythonとRを使って効率的なログ分析

R言語での統計解析。

仕事でもよくExcelとか使うけど、やってる作業ってだんだんとルーチンワークになってくるので、似たような処理はRでサクっとやっちゃいたい。

ログの解析とデバッグとか。

 

というわけで、色々と試行錯誤してみて、自分的によさげだなと思った手法メモ。

1, python正規表現ライブラリを使って、必要なデータのみ抜き出す

正規表現ライブラリの使い方。

import re

で、正規表現ライブラリをインポートする

次に、正規表現で目的の語を取り出す。

m = re.match('regex = ([0-9]+)', text)

この構文で、text変数とのマッチングを行い、結果をmに格納する。

今回は値のみ取り出したいので、"()"を使ってグループ化を行う。

グループから値を取り出すには、group関数を使う。

val = m.gropu(1);とかで、目的のグループを取り出せる。

 

2, R言語でデータの分析を行う

2-1, 目的のデータをR言語に読み込む

Rにデータを取り込むための関数

x <- read.csv("TestData.csv", header=F, col.name = c("index", "PTS") );

 ヘッダは無し。col.name=の指定で、処理しやすい列名を付ける。

 

2-2, データの分析

データのサマリを確認する

summary(x)

 

2-3, データの列数、行数を確認する。必要な部分を抽出する。

データ数が多すぎるときは、次の関数で絞り込む。

特にログなんかだと必要な部分は問題の起きた周辺のみに限られたりもするので。

 

ncol(x)とnrow(x)で、行数と列数を測定。

h = head(x, 10)    # データテーブルの先頭10レコード

t = tail(x, 10)        # データテーブルの終端10レコード

s = subset(x, Index < 10 )     # Indexが10未満のデータを抽出する

逆のパターン。ログファイルが日付をまたいだときなどに複数に分かれてしまったとき。

rbind(x, y), cbind(x, y)    # これらの関数を使ってデータを結合できる。

 

2-4, データの分割

ログには目的とするデータ以外が多数ふくまれている。

次の関数を使って、必要な情報のみ抽出する。

たとえば、ログレベルの列の値によってデータを分割するには、

error_log <- split(x, x$"LOGLEVEL")

とする。

こうすると、error_logには複数のデータフレームが取りだされる。

目的のログレベルだけほしいならば、

error_log$"FATAL_ERROR"とか。

 

2-5,分析したデータのグラフ出力

jpeg("filename")        # jpegデバイスを開く。以降のplotなどのグラフ描画処理は、このファイルに対して行われる

plot(error_log, type="l")

dev.off()                    # jpegデバイスを閉じる。

 

 

以上で、基本的な分析はできるはず。

ログ解析はちょくちょくあるので、効率的にやっちゃいましょう。

 

範囲の絞り込みなんかをパラメータで受け取るようにRとpythonついでにbashあたりを記述してやれば、そのプロジェクトにあった便利な集計用スクリプトを作り出せるはず。