この話題でわかること
- LogParserというWindows上で動くログ解析ツールを紹介
- 動作的にはテキストをSQLで抽出することができる
- LogParserの動作方法
LogParserのダウンロードはこちらから。
http://technet.microsoft.com/ja-jp/scriptcenter/dd919274.aspx
ログ解析が必要になったとき、シェルとかJavaとかプログラムを書けばできそうだけど、正直面倒。(っていうかLinuxだったらすぐできんのにな的なときとかよくある。)
出力したいことは簡単なのになーって思っている人に、Windows上で動くLogParserというツールをご紹介します。
テキストをSQLクエリで解析するツールなのでログ解析以外にも使えます。アイデアや対象データ形式によります。
もう、Windowsにさようならしたはずの俺がこんなこと書くのが不思議だなあ。
やれること
前段に記載の通り、SQLでやれそうなことができます。
Databaseではカラムに対して抽出条件を記載しますが、LogParserは基本的に1行を1カラムとして捉えて実行します。(IIS等のログフォーマットに沿って解析することでもできるようですが、無知な為触れません。)
例えば、"2014/05/20 14時00分"にアクセスされた情報が取得したい場合、
ログファイルには日時文字列が記載されてますが、
2014/05/20 14:00:00 +0000 GET /index ......
2014/05/20 14:01:42 +0000 GET /index ......
2014/05/20 14:03:30 +0000 GET /login ......
この1行が1カラムなので、単純に以下のようなSQLで取得できます。
SELECT text FROM access.log WHERE SUBSTR(text,0,16) = '2014/05/20 14:00'
簡単過ぎて鼻毛が出ちゃいますね。
感覚的にはテキストエディタの検索機能と同じです。
行をレコードとして扱える分、COUNTも取得できるし、LIKE文も使えます。
ただし、
全てのSQLクエリが使えるわけではないこと
この辺りが少しややこしい印象を受けるかもしれません。
では、実際の使い方を見てみましょう。
実例(サンプル)
■アクセスログから単位時間辺り(分)のPV数が知りたい
前提条件)
- LogParser.exeが「C:\Program Files (x86)\Log Parser 2.2」にある
- access.logのフォーマット形式で、日時文字列が行頭から始まっていること。(
C:\Program Files (x86)\Log Parser 2.2>LogParser -i:TEXTLINE "SELECT SUBSTR(text,0,16),count(*) from C:\access_log.20140520 GROUP BY SUBSTR(text,0,16)"
具体的には書きませんが、例えば、リクエストリソース単位(ページ単位)で集計したい場合は、
ApacheなりのLogFormat形式を考えて、INDEX_OF関数を使って文字列を検索しSUBSTRで抜き出す、それをGROUP BYするとか、、まあこの辺はSQLの話なので省略しますね。
もっと知りたい
自分がよく使っていた頃はあまり日本語のドキュメントがありませんでした。
どのクエリ(関数)が使えるんだよー!って困ってました。OfficeのAccessってVB関数が使えたりして頭がごちゃごちゃする傾向がありましたよね。
前置きが長くなりましたけど、結局、LogPaser自体が出してくれるヘルプが一番良いです。
LogParser -h GRAMMAR
「-i:IISW3C」のような-iオプションを使うと、規定フォーマットに沿って解析してくれて、
何文字目とか泥臭いことしなくて済むよーっていう見出しだけ記載して、
もう少し知りたい方はやってみるとHappyになるかもしれません。