バッファロのブロードバンドルータからCiscoの業務用L3スイッチまで、最近はほとんどのNW機器でロギング機能が搭載されており、これらの機器のログファイルを1台のサーバで集中管理したい。
こういったログ集約の用途ではFluentdが流行っているようだが、なるべくシンプルに済ませたいので、今回はCentOS標準のrsyslogを使ってNW機器から転送されてきたsyslogを受信する方法を調べてみた。
前提条件
・syslog送信側:お好みのNW機器
・syslog受信側:CentOS7.2(rsyslog搭載)
・syslogの送信側と受信側はネットワーク上で疎通が取れていること
・syslogの受信側は、514(UDP)のポートが開放されていること
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
ピンバック: 久しぶりの投稿。自宅鯖をいじっています。
485cx9