IP毎にログ保管し指定期間を超えたらログ削除するsyslogサーバを作る


はじめに

CentOS7上に、rsyslogを使ってsyslogサーバを構築した際の設定メモです。

実現したいこと

  1. サーバや無線アクセスポイントなど機器ごとにIP名でディレクトリを自動的に作ってログを保管。
  2. ログは各ディレクトリに1日1ファイルで残す。
  3. 一定期間が経過したログファイルを自動削除。

設定

rsyslogが入ってなければ、事前にyumでインストールする。

ログ受信に必要なポートを開ける

firewall-cmdでログ受信に必要なポートを開ける。

$ sudo firewall-cmd --add-port=514/udp --permanent
$ sudo firewall-cmd --add-port=514/tcp --permanent
$ sudo firewall-cmd --reload

rsyslog設定ファイルの変更

rsyslogの設定ファイルを変えて、実現したいことの1と2ができるようにする。

$ vi /etc/rsyslog.conf

次を変更する。

14-20行目あたりを次のようにコメントアウトして、syslogを受信できるようにする。

/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

51行目以降に次を記載して、IP単位でディレクトリを作り、日付単位でログファイルを作成する。(/var/log/rsyslogのディレクトリにログを保管するとする場合)
さらに、指定のグループ(仮にhogeとする)にもログやディレクトリに権限を与える(何もしないと作成ファイルはrootのみしか権限付与されない)。

/etc/rsyslog.conf
$umask 0000
$DirCreateMode 0770
$DirGroup hoge
$FileCreateMode 0660
$FileGroup hoge
$template hostFile,"/var/log/rsyslog/%fromhost-ip%/%$year%-%$month%-%$day%.log"

一定期間後の自動ログ削除対応

実現したいことの3については、簡単なスクリプトを作りcronに登録することで対応する。

ログ保管フォルダに存在するファイルで、最終更新が100日以上のものをfindで見つけ、それを削除するスクリプトを次のように書く。

rm-rsyslogfile.sh
#!/bin/bash
find /var/log/rsyslog/ -mtime +100 | xargs --no-run-if-empty rm

なお、xargsの--no-run-if-emptyをつけないと、対象ファイルが無い時に"rm: missing operand"のエラーが出るので、つけた方が良い。

chmodで実行可能にし、cronに登録する。(hogeユーザのホームに上記のスクリプトがあるとする。)

$ crontab -e

00 00 * * * /home/hoge/rm-rsyslogfile.sh

確認方法

別PCからログの送信(logger)をしたり、あえて古い更新時間のファイルを作ったり(touch --date)などして、動作確認する。参考文献の後ろ2つ参照。

環境

  • CentOS Linux release 7.9.2009
  • rsyslog 8.24.057.le7_9.1

参考文献