2012年2月1日水曜日

sqliteでログをとってみよう。

ふと思ったんですが、各サーバーの動作ログを一元管理したいときに、テキスト形式のログファイルを吐いたり、syslogのサーバーに集めたり、はたまたmysqlに保存したりとしますが、個人的に以下のような欠点があります。

テキスト形式のログ:動作は簡単、お手軽、検索等は文字列の検索になるので、苦手。1カ所に集めるのが面倒。
syslogのログ:動作は簡単、お手軽といえばお手軽、検索等はやりにくい。1カ所にまとめるのも簡単。UDPで通信してるので、遮断されたらだめかも。
mysqlのログ:動作はやや面倒。手軽というほどでもない。検索はやりやすい。1カ所にまとめるのもやりやすい。TCPで接続してやり取りしなければいけない。あとサービスでつかいまくってると、重いクエリを走らせたりしちゃうと、サービスに影響がでる。

といった感じです。

そこでsqliteをつかってみようと思いました。
sqliteのログ:動作はやや面倒。手軽ではある。検索はやりやすい。1カ所にまとめるのは面倒、通信しないのでサーバーが死なない限り動作できる。なんかあったら手元にダウンロードして解析とかもできる。なんといっても複数サーバーのログをまとめて、あつかったりできる。
という感じ。
あたらしい手段としては、なかなか優れてる気がします。

というわけで、さっそくいろいろ調べていきます。
まず、基本的な情報
iMacにいれてあるのはsqlite 3.6.12
CentOS(サクラVPS)にいれてあるのはsqlite 3.3.6
基本的なコマンドは次のとおり。
$ sqlite3 (dbファイル名)
テーブル作成
sqlite> create table [テーブル名] (カラム,カラム....);
データ取得
sqlite> select * from [テーブル名];
データ追加
sqlite> insert into [テーブル名] (データ, データ....);
sqliteをやめる。
sqlite> .quit;

sqliteでデータをいれたものを合成して結果を出す方法。
unionで結合すればOK

ざっとこんな感じ。
testlogというテーブルにdate(文字列) task(文字列) result(文字列)という構成があるとします。


sqlite> attach database "1.db" as a;
sqlite> attach database "2.db" as b;
sqlite> select * from a.testlog;                                                

date|task|result
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 19:40:50|test3|ng
sqlite> select * from b.testlog;
date|task|result
2012-02-01 20:40:50|test3|ng
2012-02-01 20:40:30|test4|ng?
2012-02-01 19:30:30|test5|ok
中身はこんな感じです。


さてこのログを時系列で並べるならこんな感じ

sqlite> select * from a.testlog union select * from b.testlog order by date asc;
date|task|result
2012-02-01 19:30:30|test5|ok
2012-02-01 19:40:50|test3|ng
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 20:40:30|test4|ng?
2012-02-01 20:40:50|test3|ng
ちゃんと時間順に並んでます。
order byは全体にかかるみたいです。

時間を制限するとすれば、
sqlite> select * from b.testlog where date > "2012-02-01 20:00:00" union select * from a.testlog where date > "2012-02-01 20:00:00" order by date asc;
date|task|result
2012-02-01 20:30:50|test|ok
2012-02-01 20:30:53|test2|ok?
2012-02-01 20:40:30|test4|ng?
2012-02-01 20:40:50|test3|ng
こんな感じになります。where文は両方に設定しないとだめみたいです。

とりあえずここまでの調査で、sqlite3のファイルを日付順にでも並べておいて、どこかのサーバーにまとめてしまえば特定のサーバーの特定の日付の範囲のログとか出せそうです。

あとは、phpやjava、そのほかの言語での動作の確認をチェックしてやれば・・・いろいろできるはず。

以上個人メモでした。

0 件のコメント:

コメントを投稿