前回ログを取得しましたがsyslogの設定や取得している機器で変わってくるので一概にこれとは言えませんが、
今回の私が対象とするログの構成は下記の通りです。
月 日 時間 syslogを送った機器 送信回数 log内容
Jul 20 09:00:00 hogeserver 9999: 実施のsyslog情報
送信回数まではsyslogの設定で固定なのでここは変わる事がない事がわかっています。
ただ、送信回数は要らないので今回は月日と時間と機器名とlogという4カラムに分けたいと思います。
ログを加工するスクリプトを作成します。
※作業場所は常にホームディレクトリ(/usr/local/slog)です。
# vi split.sh
#!/bin/sh
LANG=en_US.UTF-8
## last day infomation
DATE=`date –date ‘1 days ago’ +%Y`
DATEDAY=`date –date ‘1 days ago’ +%Y%m%d`
TODAY=`date +%Y%m%d`
DELDATE=`date –date ‘2 months ago’ +%Y%m%d`
## log directry
DIR=/usr/local/slog/logs/
## syslog custom
awk -v YEAR=$DATE ‘{printf(“%d%s%02d|%s|%s\n”,YEAR,$1,$2,$3,$4)}’ ${DIR}${DATEDAY}_syslog > ${DIR}${DATEDAY}_syslog.tmp1
awk ‘{for(i=5;i ${DIR}${DATEDAY}_syslog.tmp2
/usr/bin/perl -pi -e ‘s/Jan/01/g;s/Feb/02/g;s/Mar/03/g;s/Apr/04/g;s/May/05/g;s/Jun/06/g;s/Jul/07/g;s/Aug/08/g;s/Sep/09/g;s/Oct/10/g;s/Nov/11/g;s/Dec/12/g’ ${DIR}${DATEDAY}_syslog.tmp1
CNT1=`cat ${DIR}${DATEDAY}_syslog.tmp1 | wc -l`
CNT2=`cat ${DIR}${DATEDAY}_syslog.tmp2 | wc -l`
if [ $CNT1 != $CNT2 ];then
echo “syslog count unmatch !!” >> ${DIR}slog.log
exit
else
paste -d “|” ${DIR}${DATEDAY}_syslog.tmp1 ${DIR}${DATEDAY}_syslog.tmp2 > ${DIR}${DATEDAY}_syslog.txt
fi
簡単に内容を説明すると
最初のLANG設定は後にsyslogの抽出との連携させる為に入れています。
年がログからでは分からなかったのでawkでYEARに昨日の年を取得してカラムのピックアップ時に追加しています。
また、mysqlへの取り込みでスペース区切りや,区切りではログに含まれて予期せぬ場所で切れてしまうのでログに
含まれていない「|」で区切るようにしました。
そして年月日を数字化して1つのカラムにしています。printfの部分でカラム分けをしています。
あとはperlで月の英語部分を数字に置き換えています。
tmp1で1~3カラムを作ってtmp2で4カラム部分を作っています。
最後にpasteしてまとめています。
集計途中のファイルができるのでスクリプトの最後に
rm -f *syslog.tmp1
rm -f *syslog.tmp2
で削除してもいいですし、削除用スクリプトを作ってもいいと思います。
次にmysqlのテーブル作成です。
成型したカラムにある形のテーブルを作っていきます。
データベースと利用ユーザーは2回目の際に作ったものを利用します。
# mysql -u admin -ppassword ←-pだけで次にパスワード入力にしてもいいと思います。
mysql> use syslogdb; ←データベースに移動します。
mysql> create table syslogtable(date int(10),time varchar(10),node varchar(50),log varbinary(1000)); ←カラムの値は想定される範囲で決めて下さい。
logのカラムをバイナリにしているのは文字化けしたログがある為にバイナリで取得するようにしています。
mysql> show tables; 確認
+——————–+
| Tables_in_syslogdb |
+——————–+
| syslogtable |
+——————–+
1 row in set (0.00 sec)
mysql> desc syslogtable; 確認
+——-+—————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+—————–+——+—–+———+——-+
| date | int(10) | YES | | NULL | |
| time | varchar(10) | YES | | NULL | |
| node | varchar(50) | YES | | NULL | |
| log | varbinary(1000) | YES | | NULL | |
+——-+—————–+——+—–+———+——-+
4 rows in set (0.01 sec)
取り込めるかどうか確認してみます。
mysql> load data local infile “/usr/local/slog/logs/20130719_syslog.txt” into table syslogtable fields terminated by ‘|’ lines terminated by ‘\n’;
Query OK, 18558 rows affected, 65535 warnings (0.12 sec)
Records: 18558 Deleted: 0 Skipped: 0 Warnings: 55674
mysql> select * from syslogtable; ←少なければtable中身を全部表示させてみます。多ければwhere等で制限して下さい。
問題ない事が確認できたらデータは一旦消します。
mysql> delete from syslogtable;
Query OK, 18558 rows affected (0.00 sec)
ひとまずログを取り込める所まで来ましたので次はインターフェース部分を作っていきます。
次回はサイトの外部UIを作成です。