0 && $edn < $lmax ) ? $edn: $lmax; $fmt = '%0'.strlen($edn).'d: '; for (; $stn<=$edn; $stn++ ) { $tstr = htmlspecialchars(mb_convert_encoding($lines[$stn-1],SOURCE_ENCODING,"auto")); $res .= ( $args[2] ? sprintf($fmt,$stn):'').refpre_replace_tab($tstr); } return '
'.$res.'
'; } ?> Linux:サーバのログの情報を収集してSQLITEに投入 - HiiHahWIKI - making some notes for... -
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Linux:サーバのログの情報を収集してSQLITEに投入

Last-modified: 2013-08-24 (土) 02:14:21 (3895d)
Top / Linux:サーバのログの情報を収集してSQLITEに投入

Linux:サーバのログの情報を収集してSQLITEに投入

サーバが一桁台であれば、目で見てまとめることもできますが、3桁台となるとそうもいかないです。

実際そういう状況に遭遇しているため、シェルをいろいろ作って、最終的にSQLITEに投入して情報をいろいろ見れるようにしました。

せっかくなのでそのまま残します。

01_findlogs.sh
「target.txt」に記載されるサーバにsshでfindコマンドを実行し、結果ファイルを出力します。
02_seikei.sh
01_findlogs.shの出力ファイルを入力として、DBに投入するようにsed、awkを使って整形します。
このシェルの中のsedで、あとからDBでグルーピングしやすいようにどのログかを分かるようにデータを整形してます。
03_CreateTable?.sh
ddl.sqlを実行してsqliteにテーブル、インデックスを作成します。
ddl.sql
03_CreateTable?.shから実行されるDDL文が入ってます。
04_to_sqlite.sh
02_seikei.shの出力ファイルを入力として、03で作ったテーブルにデータを投入します。

各スクリプトの中身

こんな感じです。

なお、01、02、04のスクリプトからは、共通のファイル「target.txt」が入力となります。

■target.txt(IPアドレスもしくはホスト名を1行1レコードで記述)

192.168.1.100
localhost

file01_findlogs.sh

#refpre(01_findlogs.sh,,1);

file02_seikei.sh

#refpre(02_seikei.sh,,1);

file03_CreateTable.sh

#refpre(03_CreateTable?.sh,,1);

fileddl.sql(03で実行されるDDL)

#refpre(ddl.sql,,1);

file04_to_sqlite.sh

#refpre(04_to_sqlite.sh,,1);

データをSQLITEに投入したら、もう好きなように調理してー

投入したデータの取り出しサンプル

ちなみに、こんな感じのSQLで、各サーバ毎のログの状況が確認できます。

// サーバ一覧を保持するテーブルを作成
CREATE TABLE server ( servername text );

// テーブルにレコードをインサート
insert into server(servername)
  select server from logcheck group by server;

// 種別に前方一致するレコードを外部結合して表示する
select 
 A.servername,
 B.filename,
 B.count_server,
 B.avg_filesize,
 B.max_filesize,
 B.max_date,
 B.min_date 
from
 server A left join
 (
	select
	 server , 
	 filename ,
	 count(server) 'count_server', 
	 avg(filesize) 'avg_filesize', 
	 max(filesize) 'max_filesize', 
	 max(date) 'max_date',
	 min(date) 'min_date'
	from 
	 logcheck 
	where
	 filename like '/var/log/httpd/access_log%' 
	 group by server
 ) B
 on A.servername = B.server;
 

出力はこんな感じ。

servername|filename|count_server|avg_filesize|max_filesize|max_date|min_date
server01|/var/log/httpd/access_log.4|88|8215450.44318182|158792484|201201175617|201110011010
server02||||||
server03||||||
server04||||||
server05|/var/log/httpd/access_log.4|88|8131064.11363637|158887060|201201175617|201110040013
server06|/var/log/httpd/access_log.4|88|8235275.89772728|159015231|201201175617|201110040012
server07|/var/log/httpd/access_log.4|88|8234481.61363637|159024446|201201175617|201110044510

参考サイト


添付ファイル: fileddl.sql 1251件 [詳細] file04_to_sqlite.sh 1080件 [詳細] file03_CreateTable.sh 1087件 [詳細] file01_findlogs.sh 1085件 [詳細] file02_seikei.sh 1185件 [詳細]