■ローテーション前に、前日までのログから任意のキーワードで抽出、メールする。
debian squeezeで前日の「/var/log」配下の大文字小文字を無視して、
以下の4つのキーワードで抽出する。
「error」「warn」「crit」「fail」
■既知のエラーは無視
「grep -v pcspkr」
■「auth.log」は除く。
「find ... ! -name "auth.log" 」
■findには以下のようなオプションがある。
$ man find | grep -A 1 "\-*min n" | xargs echo -n | \
sed s/"min n"/"&\t"/g | sed s/"\-\- "/"\n"/g | sed s/" *"/" "/g;echo
-amin n ファイルが最後にアクセスされたのが n 分前であれば真。
-cmin n ファイルのステータスが最後に変更されたのが n 分前であれば真。
-mmin n ファイルのデータが最後に修正されたのが n 分前なら真。
■よって以下のように書ける。
「auth.log」を除外するのは、ループしないようにする為。
$ su root -c '
find /var/log -type f -mmin -15 ! -name "auth.log" -print | grep -i "error\|warn\|crit\|fail" `xargs`
' | \
sed s/"`hostname -s`"/"dummy-host"/g | head -5 | sed s/"[A-z]\:"/"&\n\t"/g
パスワード:
/var/log/syslog:
Nov 5 06:25:10 dummy-host /USR/SBIN/CRON[7545]:
(CRON) error (grandchild #7549 failed with exit status 1)
/var/log/syslog:
Nov 10 20:50:14 dummy-host kernel:
[ 1.622122] PM:
Resume from disk failed.
/var/log/syslog:
Nov 10 20:50:14 dummy-host kernel:
[ 3.216608] PM:
Error -22 checking image file
/var/log/syslog:
Nov 10 20:50:14 dummy-host kernel:
[ 3.216611] PM:
Resume from disk failed.
/var/log/syslog:
Nov 10 20:50:14 dummy-host kernel:
[ 6.643860] Error:
Driver 'pcspkr' is already registered, aborting...
■上記を元にスクリプト化。
$ cat myscripts/syslogcheck.sh
if [ `id -u` -ne "0" ];then
echo "Sorry,Not Permit User!" >&2
exit 1
fi
UNIXTIMENOW=`date '+%s'`
CHECKLOG=${UNIXTIMENOW}.log
ATTACHED=`date -d "1 days ago" '+%Y%m%d_syslogcheck.gz'`
test -d /tmp && cd /tmp
touch ${CHECKLOG}
if [ ! -f ${CHECKLOG} ];then
echo $?
exit 1
fi
find /var/log -type f -mtime -1 ! -name "auth.log" -print | \
grep -i "error\|warn\|crit\|fail" `xargs` | \
grep -v pcspkr | \
sed s/"[A-z]\:"/"&\n\t"/g > ${CHECKLOG}
if [ -s ${CHECKLOG} ];then
gzip ${CHECKLOG}
gzip -t ${CHECKLOG}.gz && rm -f ${CHECKLOG}
uuencode ${CHECKLOG}.gz ${ATTACHED} | mail -s "Yesterday $0 Report" root@`hostname -f`
fi
unset UNIXTIMENOW
unset CHECKLOG
unset ATTACHED
exit 0
-----
□2012/12/15追記
githubに置きました。
https://github.com/labunix/syslogcheck
-----
■実行
$ chmod +x myscripts/syslogcheck.sh
$ sudo ./myscripts/syslogcheck.sh
■「mail」の「s」コマンドで保存
※rootから転送されたユーザでログインした場合
$ mail
>N 1 root@.....
& s 1
"1" [New file]
& q
■begin〜end行まで残して他は削除。
$ grep -A `wc -l < 1` begin 1 > attached
$ uudecode attached
$ gzip -l 20121212_syslogcheck.gz
compressed uncompressed ratio uncompressed_name
11310 211215 94.7% 20121212_syslogcheck
$ zcat 20121212_syslogcheck.gz | head -4
/var/log/debug:
Nov 10 20:50:14 vmsqueeze-nclean kernel:
[ 1.622122] PM:
Resume from disk failed.
■余談だが、「logmon」も「swatch」も今回は役に立たなかった。
■まず「logmon」パッケージはそもそもパッケージとして存在しない。
$ apt-cache search logmon | wc -l
0
■swatchはPerlベース。
モジュールを要求する割に大したことは出来ない。
その上、設定ファイルもinitスクリプトも用意されていない。
logmonと異なり、1プロセスで読めるのは1ファイルという制限もある。
「READMEを読んで、好きにすれば?」という感じかな?
$ apt-cache search ^swatch | wc -l
1
$ apt-cache show ^swatch | grep ^Depends | sed s/"\, "/"\n"/g
Depends: perl (>= 5.6.1)
libtimedate-perl
libtime-hires-perl
libdate-calc-perl
libfile-tail-perl
libdate-manip-perl
$ sudo apt-get install -y swatch
$ apt-cache show ^swatch | grep ^Description
Description-ja: 正規表現マッチング、構文強調やフック機能を持つログファイルビューア
$ dpkg -L swatch | grep "README\|examples\/"
/usr/share/doc/swatch/examples/SendMail.pm
/usr/share/doc/swatch/README.gz
■設定が面倒だし、設定したとしてもやれることは限られているのでアンインストールした。
※古めのRedhat系でしか使ってないw。
$ sudo apt-get purge swatch