SYSLOG検索くん 第7回

今回は当日のログの取り込みを実施する部分になりますが、
まずは前回の残りであるcsv.phpを作ります。

<?php
/* セッション作成 */
session_start();

/* セッションからの展開 */
$node = $_SESSION[‘node’];
$moji = $_SESSION[‘moji’];
$years = $_SESSION[‘years’];
$months = $_SESSION[‘months’];
$days = $_SESSION[‘days’];
$yeare = $_SESSION[‘yeare’];
$monthe = $_SESSION[‘monthe’];
$daye = $_SESSION[‘daye’];

header(“Content-Type: application/octet-stream”);
header(“Content-Disposition: attachment; filename=syslog.csv”);

/* ヘッダー作成 */
print( “date,time,node,log,\n”);

/* ログイン */
$link = mysql_connect(‘localhost’, ‘root’, ‘system’);
if (!$link) {
die(‘接続失敗です。’.mysql_error());
}

/* データベース選択 */
$db_selected = mysql_select_db(‘syslogdb’, $link);
if (!$db_selected){
die(‘データベース選択失敗です。’.mysql_error());
}

mysql_set_charset(‘utf8’);

/* 検索用2桁登録 */
$months = sprintf(“%02d”,$months);
$days = sprintf(“%02d”,$days);
$monthe = sprintf(“%02d”,$monthe);
$daye = sprintf(“%02d”,$daye);

$select_all = “select * from syslogtable where date between ‘$years$months$days’ and ‘$yeare$monthe$daye’ and node like ‘%$node%’ and log like ‘%$moji%'”;
$result_all = mysql_query($select_all);

//値を取得
while($row = mysql_fetch_assoc($result_all)){

//本文出力
print($row[‘date’].”,”.$row[‘time’].”,”.$row[‘node’].”,”.$row[‘log’].”,\n”);
}

?>

csv出力で重要なのは下記の2文だけです。

header(“Content-Type: application/octet-stream”);
header(“Content-Disposition: attachment; filename=syslog.csv”);

MIMEタイプを設定して(octet-streamが無難です)名前を付けて保存する設定を入れるだけです。
あとは単純にセッションを引き継いできて同じ内容を出力させるようにしているだけです。

続いて当日分のログの取り込みですが、基本的に通常のログの取り込みと同じです。
サイト画面から実行できるようにする為にHTMLファイルのヘッダー部分で指定している
pick.phpというファイルを作ります。

pick.php
<?php include(“header.html”); ?>

<p>当日のSYSLOG取得はこちら</p>
<button type=button onclick=”window.open(‘today.php’,’_blank’);”>cisco</button>

<?php include(“footer.html”); ?>

とりあえずボタンを作ってphpを動かすようにしてみました。
実際取り込みをするのはシェルなのでtoday.phpではシェルを実行するようにしています。

<?php

$sys =’/bin/sh /usr/local/slog/today.sh’;
$output = array();
$ret = null;

exec($sys,$output,$ret);

print_r(“SYSLOGの取り込みが完了しました。”);

?>
<br>
<button type=button onclick=”window.close();”>閉じる</button>

execにて取り込み用のスクリプトを動かしています。
で実際のスクリプトは下記のように作りました。

#!/bin/sh
#
# syslog pick up
#
#
#
#############################################################
## set LANG
export LANG=ja

## last day infomation
DATE=`date –date ‘1 days ago’ +%Y`
DATEDAY=`date –date ‘1 days ago’ +%Y%m%d`
TODAY=`date +%Y%m%d`

## log directry
DIR=/usr/local/slog/logs/

## syslog today get
expect -c ”
set timeout 60
spawn scp user@192.168.1.1:/var/log/syslog/syslog.0 ${DIR}${DATE}_syslog
expect {
\”Are you sure you want to continue connecting (yes/no)?\” {
send \”yes\n\”
expect \”パスワード\”
send \”password\n\”
} \”パスワード\” {
send \”password\n\”
}
}

expect {
\”100%\” {exit}
}

## reset LANG
LANG=en_US.UTF-8

## today syslog
awk -v YEAR=$DATE ‘{printf(“%d%s%02d|%s|%s\n”,YEAR,$1,$2,$3,$4)}’ ${DIR}${TODAY}_syslog > ${DIR}${TODAY}_syslog.tmp1

awk ‘{for(i=5;i<NF;i++){printf(“%s “,$i)}print $NF}’ ${DIR}${TODAY}_syslog > ${DIR}${TODAY}_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}${TODAY}_syslog.tmp1

CNT1=`cat ${DIR}${TODAY}_syslog.tmp1 | wc -l`
CNT2=`cat ${DIR}${TODAY}_syslog.tmp2 | wc -l`

if [ $CNT1 != $CNT2 ];then
echo “syslog count unmatch !!” >> ${DIR}slog.log
exit
else
paste -d “|” ${DIR}${TODAY}_syslog.tmp1 ${DIR}${TODAY}_syslog.tmp2 > ${DIR}today_syslog.txt
fi

## last check
if [ -e ${DIR}today_syslog_dif.txt ];then
rm -f ${DIR}today_syslog_dif.txt
fi
diff ${DIR}syslog_check.txt ${DIR}today_syslog.txt | grep “^>” | sed ‘s/^> //g’ > ${DIR}today_syslog_dif.txt

## mysql inport
mysql -u root -psystem syslogdb -e “load data local infile \”${DIR}today_syslog_dif.txt\” into table syslogtable fields terminated by ‘|’ lines terminated by ‘\n’;”

## next checkfile
cat ${DIR}today_syslog.txt > ${DIR}syslog_check.txt

## tmp log delete ##
rm -f ${TODAY}_syslog.tmp1
rm -f ${TODAY}_syslog.tmp2

ログをSYSLOGサーバから取得するのとMYSQLへ投入するのも全てまとめてみました。
これで当日のログの取得ができます。

これまでのものでひとまずはSYSLOG検索くんは要件を満たした形で動くようになっているはずです。

次回は最終回、まとめになります。

コメントする