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 です。