logwatch で独自サービスのログを追加する
logwatch
で独自サービスのログを追加する場合の手順です。rsync
が出力するログを題材に、ログファイルやサービスの指定方法、独自の日付フィルタの作成方法などについて紹介します。
事例: 自動バックアップのログを追加する
私は rsync
で自動バックアップを取っています。自動処理の場合、動いていると思っていたら、実は動いてなかった、あるいはエラーが発生していた、というのはまずいパターンです。異常を検知するために、私は自動処理の動作状況の確認は必須と考えていますので、logwatch
で動作ログをメール送信し、毎日確認することにします。
rsync
のログは、以下のような形式で、/var/log/rsync
に出力されています。
2023/12/28 00:00:05 [22861] building file list 2023/12/28 00:00:19 [22861] git/setup.git/objects/21/c9db5e36dd3a6b7314195c3cf2a54fecc71d02 2023/12/28 00:00:19 [22861] git/setup.git/objects/27/df2b96fe25286ff4103ba379caa9e099cbe100 2023/12/28 00:00:19 [22861] git/setup.git/objects/2b/ec79d11419e18a4c6df8d8bc87f62cc748f355 ... 2023/12/29 00:00:57 [35341] sent 37895348 bytes received 78400 bytes total size 10152716830
ログファイルの指定
まず、logwatch
にログファイルの場所を教えます。/etc/logwatch/conf/logfiles/rsync.conf
を以下のように作成します。
LogFile = rsync LogFile = rsync-*[0-9] Archive = rsync-*.gz *ApplyJapanDate
ログファイルは。/var/log
からの相対パスです。logrotate
するので、一応ローテート後のファイル名も書いておきます。
logwatch
が日付を認識できる必要があるので、日付の認識方法も合わせて指定します。
2023/12/28 00:00:05
のような、私たちが見慣れた形式は logwatch
が認識してくれません。
そこで、ApplyJapanDate
というフィルタを作成し、指定します。標準的には、以下の 6つのフィルタが入っていますので、ここからパクってきて作るのが簡単です。
$ rpm -ql logwatch | grep apply | grep shared /usr/share/logwatch/scripts/shared/applybinddate /usr/share/logwatch/scripts/shared/applyeurodate /usr/share/logwatch/scripts/shared/applyhttpdate /usr/share/logwatch/scripts/shared/applystddate /usr/share/logwatch/scripts/shared/applytaidate /usr/share/logwatch/scripts/shared/applyusdate $
ファイルの設置場所は、/etc/logwatch/scripts/shared/applyjapandate
です。パーミッションは 644
です。applyeurodate
が近い形式なので、これをコピーして、以下のように変えます(色が付いている行)。
use strict; use Logwatch ':dates'; my $Debug = $ENV{'LOGWATCH_DEBUG'} || 0; my $SearchDate = TimeFilter($ARGV[0] || '%Y/%m/%d %H:%M:%S(,...)? '); if ( $Debug > 5 ) { print STDERR "DEBUG: Inside ApplyJapanDate...\n"; print STDERR "DEBUG: Looking For: " . $SearchDate . "\n"; } while (defined(my $ThisLine = <STDIN>)) { if ($ThisLine =~ m/^$SearchDate/o) { print $ThisLine; } } # vi: shiftwidth=3 syntax=perl tabstop=3 et # Local Variables: # mode: perl # perl-indent-level: 3 # indent-tabs-mode: nil # End:
サービスの指定
サービス名とログファイルを指定します。
/etc/logwatch/conf/services/backup-daily.conf
を以下のように作成します。
Title = "backup" LogFile = rsync
backup-daily.conf
のうち、backup-daily
がサービス名になります。同様に、先ほど作った rsync.conf
のうち、rsync
がログファイル名になるので、LogFile
に指定します。Title
は人間が読む部分なので、好きなものを指定します。
サービスに対して、ログ整形用スクリプトを書きます。/etc/logwatch/scripts/services/backup-daily
を以下のように作成します。
#!/usr/bin/sed -rf s/^[0-9\/: ]+\[[0-9]+\] / /g
ファイル名はサービス名と一致させる必要があります。タイムスタンプやプロセス ID はいらないので削ります。コードをできるだけ書きたくないので、sed
で処理します。shebang に sed
を指定して、拡張正規表現が使えるように -r
も指定しておきます。
テスト実行
サービス名を指定し、出力先を標準出力として、テスト実行します(ログを読む必要があるため、要 root
権限)。
# logwatch --service=backup-daily --output=stdout ... --------------------- backup Begin ------------------------ building file list git/setup.git/objects/21/c9db5e36dd3a6b7314195c3cf2a54fecc71d02 git/setup.git/objects/27/df2b96fe25286ff4103ba379caa9e099cbe100 git/setup.git/objects/2b/ec79d11419e18a4c6df8d8bc87f62cc748f355 .. sent 29071156 bytes received 60132 bytes total size 10121335775 ---------------------- backup End ------------------------- #
一部、省略していますが、上記のように出力されれば OK です。