rsyslogを使って複数のリモートホストから転送されたログを集約保存する方法

rsyslogを使って複数のリモートホストから転送されたログを集約保存する方法hosiiのメモ帳バッファロのブロードバンドルータからCiscoの業務用L3スイッチまで、最近はほとんどのNW機器でロギング機能が搭載されており、これらの機器のログファイルを1台のサーバで集中管理したい。

こういったログ集約の用途ではFluentdが流行っているようだが、なるべくシンプルに済ませたいので、今回はCentOS標準のrsyslogを使ってNW機器から転送されてきたsyslogを受信する方法を調べてみた。

前提条件

・syslog送信側:お好みのNW機器
・syslog受信側:CentOS7.2(rsyslog搭載)
・syslogの送信側と受信側はネットワーク上で疎通が取れていること
・syslogの受信側は、514(UDP)のポートが開放されていること

論理的なイメージは以下の通り。
syslog

Syslog受信設定(自分以外の全てのSyslogを受信)

CentOS7系では標準でrsyslogがインストールされているので、設定ファイル(/etc/rsyslog.conf)を編集する。
Syslogsサーバ自身以外の機器から自分宛に送信されてきたすべてのSyslogを受信する設定は以下の通り。

まずはUDPによる外部からのSyslogの受信を有効化するため、ファイル上部のUDPモジュールのコメントアウトを外す。

#$ModLoad imudp
#$UDPServerRun 514

↓

$ModLoad imudp
$UDPServerRun 514

設定ファイル中46行目付近、ルール記述部分のすぐ上に、ログファイルの保存先とファイル名を書いたテンプレートを追記。
今回の例では、”/var/log/hosts/”ディレクトリの下に、Syslog送信元となるリモートホスト単位でホストネームのついたファイル名でログを保存するテンプレートを、”RemoteHost”という名前で作成する。

#### RULES ####

↓

#### TEMPLATES ####
$template RemoteHost,"/var/log/hosts/%HOSTNAME%.log"

#### RULES ####

最後に、ルール記述部分の一番上に、リモートホスト用のログ保存ルールを記載する。
今回の例では、sysylogの送信元IPが自分以外(127.0.0.1以外)のログを受信した場合、RemoteHostテンプレートで指定した場所にログを保存する。
そのすぐ下に”& ~”を記述することで、その後のルールが再度適用されることを防ぐ。

#### RULES ####

↓

#### RULES ####
## Remote host logging
:fromhost-ip, !isequal, "127.0.0.1" -?RemoteHost
& ~

編集前のファイルのバックアップと差分を取ると以下のようになる。

# diff /etc/rsyslog.conf /etc/rsyslog.conf.bak
15,16c15,16
< $ModLoad imudp
< $UDPServerRun 514
---
> #$ModLoad imudp
> #$UDPServerRun 514
45,46d44
< #### TEMPLATES ####
< $template RemoteHost,"/var/log/hosts/%HOSTNAME%.log"
49,51c47
< ## Remote host logging
< :fromhost-ip, !isequal, "127.0.0.1" -?RemoteHost
< & ~ --- >

Syslog受信設定(特定機器のSyslogを受信)

特定機器のSyslogのみ受信したい場合は、以下のように設定する。

自分以外のすべての機器からのSyslogを受信するときと同様、UDPによる外部からのSyslogの受信を有効化するため、ファイル上部のUDPモジュールのコメントアウトを外す。

#$ModLoad imudp
#$UDPServerRun 514

↓

$ModLoad imudp
$UDPServerRun 514

次に、ルール記述部分の一番上に、Syslog送信側機器ごとにログ保存ルールを記載する。
今回の例では、Syslog送信機器のIPアドレスが”192.168.128.254″のログを受信した場合、”/var/log/network/catalyst3570.log”にログを保存する。

#### RULES ####

↓

#### RULES ####
# RULES1 cisco catalyst
:fromhost-ip, isequal, "192.168.128.254"  -/var/log/network/catalyst3750.log
& ~

編集前のファイルのバックアップと差分を取ると以下のようになる。

# diff /etc/rsyslog.conf /etc/rsyslog.conf.bak
15,16c15,16
< $ModLoad imudp
< $UDPServerRun 514
---
> #$ModLoad imudp
> #$UDPServerRun 514
47,49c47
< # RULES1 cisco catalyst
< :fromhost-ip, isequal, "192.168.128.254"  -/var/log/network/catalyst3750.log
< & ~
---
> 

ルールに記述する条件式は、IPアドレス以外にも色々な条件を使える。
詳しくは、この辺りを参照。
CentOS rsyslogの設定(http://www.unix-power.net/linux/rsyslog.html)

“/var/log/hosts/”ディレクトリを作成した状態で、ルータなどのNW機器にSyslogサーバ宛の送信設定を入れて、受信側のSyslogサーバで”/var/log/hosts/”の下にホスト名のログファイルができていれば受信OK。

ログローテーション

受信したsyslogファイルは、放っておくと日々ファイル容量が増加していく。
そのため、ある程度のタイミングでログローテーションを行う必要がある。
ログローテーションにはCentOS7.2標準のlogrotateを使用する。

NW機器から受信したSyslog用のローテーション設定ファイルを以下の名前で作成する。

vi /etc/logrotate.d/nw

#以下の内容を記載
/var/log/hosts/*.log
{
    daily
    create
    dateext
    missingok
    rotate 90
    compress
    ifempty
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

以下1行ずつ解説。

ここで指定した場所のファイルに、ファイルで設定したローテーションを実施する。
ファイルは複数行記述可能。不特定多数のファイルをローテーションさせたい場合は、必ずワイルドカードの後に拡張子(.log)を入れる。
拡張子を入れないと、ローテーション後の日付のついたファイルにさらに日付が付与され、永久に同じファイルがローテーションされ続けるので注意。

/var/log/hosts/*.log

logrotateの標準設定(/etc/logrotate.conf)では、ローテーションは週次で行われる設定になっているので、日次ローテーションを明示的に指定する。

sharedscripts

ローテーション後、新しく空のログファイルを作成する。

create

ローテーション後のファイル名にローテーションを実施した日付を付与する。

dateext

ローテーション後のファイルの保存数を90世代までに指定する。これ以降の古いログファイルは削除される。

rotate 90

ローテーション後のファイルの肥大化を防ぐため、ローテーション後はgz形式でファイルの圧縮を行う。

compress

ファイルが空の場合でもローテーションを行う。

ifempty

複数ファイルのローテーションをする際、後述のpostrotateで記述している処理をまとめて行う。

sharedscripts

ファイルローテーション後、postrotateとendscriptの間に記述したスクリプトを実行する。
ローテーション後、rsyslogの再起動を行う。
この処理を行わないと、ローテーション後のファイルに延々とログが書き込まれるので忘れずに記述する。

postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript

検証

実際にログファイルを作成して、ローテーションできるか確認してみる。
一度logrotateを実行した後、ローテーション状態を管理するファイル(/var/lib/logrotate.status)を編集することで、ローテーション状態を擬似的に1日前に戻す。
再度logrotateを実行すると、ファイルがローテーションされることを確認できる。

touch  /var/log/hosts/test.log
ls /var/log/hosts/
   test.log
logrotate  /etc/logrotate.d/nw
vim /var/lib/logrotate.status 
#以下の通り日付を1日戻す。
###ここから###
"/var/log/hosts/test.log" 2016-6-12-16:47:27
↓
"/var/log/hosts/test.log" 2016-6-11-16:47:27
###ここまで###

logrotate  /etc/logrotate.d/nw
ls /var/log/hosts/
   test.log  test.log-20160612.gz

rsyslogを使って複数のリモートホストから転送されたログを集約保存する方法」への2件のフィードバック

  1. ピンバック: 久しぶりの投稿。自宅鯖をいじっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です