hunamizawa’s blog

無い物は作りたい人のメモ帳

logwatch をアップデートして Unmatched Entries を減らす方法

VPS 等のログ監視で定番の logwatch。仕組みとしては、事前に作成したperlスクリプトで、ログを1行ずつ仕分けして整形している。

ただ、監視対象のバージョンアップでログ出力書式が変化すると「パターンに一致しないログが見つかった」旨の警告が大量にレポートされて鬱陶しいことがある。例えばこんな感じ。

 --------------------- SSHD Begin ------------------------
(中略)
**Unmatched Entries**
Disconnected from user XXX 127.0.0.1 port 53084 : 1 time(s)
Disconnected from user XXX 192.168.XXX.XXX port 49867 : 1 time(s)
(同じような行が何行も続く)

これは、sshd の Disconnected ログの書式が変更された後に送られてきた、logwatch のレポートである。このログはユーザーがログアウトするたびに記録されるから、結果としてどうでもいいログがレポートにダラダラと並ぶわけである。これでは「Unmatched Entries って何やねん」と調べる時間がもったいないし、重要なログの見落としの可能性も高くなる。

logwatch の開発コミュニティでは当然すぐ修正されるが、それが各Linuxディストリの公式リポジトリに上がってくるまでにはかなりのラグが生じる。それまではゴミログにずっと耐えろって?

実は logwatch には、(systemd の drop-in ファイルのように)デフォルトのスクリプトを上書きすることなく変更する機能がある。以下は /usr/share/doc/logwatch/HOWTO-Customize-LogWatch.gz の抄訳である。

5. Customizing the Scripts

(4. で述べられている)設定ファイルのカスタマイズと同じように、(訳注: /usr/share/logwatch/scripts にある)既存のスクリプトもオーバーライドできます。

新しいスクリプトファイルは、/usr/share/logwatch/scripts から見て同じ相対パス、かつ同じファイル名にして、/etc/logwatch/scripts 以下に配置してください。このようなファイルが見つかれば、それに対応する /usr/share/logwatch/scripts 以下のスクリプトは無視されます。

つまり、最新のスクリプト開発リポジトリから丸々 /etc/logwatch/scripts にコピーしてしまえば、余計な苦労をせずにゴミログを減らせる=レポートが読みやすくなる。というわけで、シェルスクリプトを組んでみた。

#!/bin/bash -eu

if [ -e ~/logwatch-git ]; then
  cd ~/logwatch-git
  git pull origin master
else
  git clone -b master --depth 1 https://git.code.sf.net/p/logwatch/git ~/logwatch-git
  cd ~/logwatch-git
fi
cd scripts/services
cp * /etc/logwatch/scripts/services

実際にオーバーライドしているのは、/usr/share/logwatch/scripts 以下のみに留めている。

後は crontab に突っ込めば完了(自分は週に1度走らせている)。正常に cron が回っていれば

>From https://git.code.sf.net/p/logwatch/git
 * branch            master     -> FETCH_HEAD
Already up to date.

のようなメールが飛んでくるはずである。

当然のことだが、ディストリの公式リポジトリに比べると、新たなバグを持ち込んでしまったり、それが原因でログを見落としてしまうリスクは若干高い。皆さんも cron で回す時は「読みやすいレポートが得られるベネフィットの方がずっと大きい」と信じて回してください。