ローテーション前に、前日までのログから任意のキーワードで抽出、メ

■ローテーション前に、前日までのログから任意のキーワードで抽出、メールする。
 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
#!/bin/bash
# Last Update:  2012/12/12
# Author: labunix@gmail.com
# Depends:      Package Name(Command Name)
#         sharutils(uuencode/uudecode)
#         gzip(gzip)
#         bsd-mailx(mail)

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'`

# Working Directory
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