◆ 目的
syslogで受け付けたログを別サーバへsyslogを使って転送させる。
ログの取りこぼしを可能な限り避けたいのでtcpを利用できるrsyslogを利用する。
それ以外にもsyslogよりrsyslogの方がメリットが多いのでsyslogを選択する理由はないだろう。
◆ 環境
・ 転送元サーバ群
・ 転送先サーバ
IPアドレス : 192.0.2.1(設定で使うため)
転送元 転送先
サーバ群 サーバ(192.168.2.1)
-----
| | →
-----
----- -----
| | → | |
----- -----
-----
| | →
-----
local6.* local6.info
適合:match1, match2
除外:test1, test2
転送元サーバからrsyslog経由で転送先サーバへログを飛ばす。
すべて転送するのではなく、ファシリティが6(local6)のすべてのプライオリティを対象とする。
転送先では以下の条件にマッチしたものだけをログに出力させる。
近くで除外するという考えが正しいのだろうが、
転送元ノードが多くなった場合に、ポリシーを一元管理させたいためにそうする。
【適合条件】
・match1 または match22 文字列が含まれる
・ファシリティがlocal6でプライオリティがinfo以上
【除外条件】
・test1 または test2 文字列が含まれる
複数台いることを想定
IPアドレス : 192.0.2.1(設定で使うため)
サーバ群 サーバ(192.168.2.1)
-----
| | →
-----
----- -----
| | → | |
----- -----
-----
| | →
-----
local6.* local6.info
適合:match1, match2
除外:test1, test2
すべて転送するのではなく、ファシリティが6(local6)のすべてのプライオリティを対象とする。
転送先では以下の条件にマッチしたものだけをログに出力させる。
近くで除外するという考えが正しいのだろうが、
転送元ノードが多くなった場合に、ポリシーを一元管理させたいためにそうする。
【適合条件】
・match1 または match22 文字列が含まれる
・ファシリティがlocal6でプライオリティがinfo以上
【除外条件】
・test1 または test2 文字列が含まれる
◆ syslogからrsyslogへの切り替え(転送元、転送先共通)
# /etc/init.d/syslog stop
# chkconfig syslog off
# yum install rsyslog
# chkconfig rsyslog on
パッケージで入れていれば自動で入るはず。
# cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
◆ rsyslog設定(転送元、転送先共通)
# cp /etc/rsyslog.conf /etc/rsyslog.conf.default
# vi /etc/rsyslog.conf
# 読み込ませたいその他コンフィグディレクトリファイルの指定
$IncludeConfig /etc/rsyslog.d/*.conf# タイムスタンプフォーマット
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# カーネルログのサポート (previously done by rklogd)
$ModLoad imklog
# ローカルシステムログのサポート (e.g. via logger command)
$ModLoad imuxsock
# 下段にて説明※
$SystemLogRateLimitInterval 0
# $SystemLogRateLimitInterval 10
# $SystemLogRateLimitBurst 500
# 514/udpソケットで受付
$ModLoad imudp
$UDPServerRun 514
# $AllowedSender UDP, 127.0.0.1, 192.168.0.0/24, *.example.jp, host.example.jp
# 514/tcpでソケット受付
$ModLoad imtcp
$InputTCPServerRun 514
# $AllowedSender TCP, 127.0.0.1, 192.168.0.0/24, *.example.jp, host.example.jp
### スプールを使用する場合
# スプール方式の指定
# サーバにログを送信する前に一時的にログを蓄える
$ActionQueueType Disk
# スプールディレクトリの指定
$WorkDirectory /var/spool/rsyslog
# ログ送信の再試行回数(-1で無限に再試行を実行)
$ActionResumeRetryCount 5
# スプールディレクトリに作られるキューのファイル名「例:queue.00000001」
$ActionQueueFileName queue
#シャットダウン時にメモリ上のキューを保存
$ActionQueueSaveOnShutdown on
※
/var/log/messagesにrsyslogが以下のようなログを出すことがある。
imuxsock begins to drop messages from pid ***** due to rate-limiting
ディフォルト10秒間に500以上のメッセージを1つのPIDから受信した場合、
rate-limitingが動作しメッセージが捨てられる。
メッセージのロストを防ぐために制限をなくすために0を指定した。
加えて短い時間に大量にログを発生させる原因の追及もあわせてやるべきである。
◆ rsyslog設定(転送元)
# vi /etc/rsyslog.conf
# 転送先の指定(@はudp, @@はtcp)
local6.* @@192.0.2.1:514
# /etc/init.d/rsyslog restart
◆ rsyslog設定(転送先)
# mkdir /etc/rsyslog.d/
少し煩雑だがやっていることはすぐに分かるだろう。
・ログの出力フォーマットの変更
・条件文の設定
# vi /etc/rsyslog.d/my.conf
$template myFormat, "%HOSTNAME% %msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
$ActionFileDefaultTemplate myFormat
if \
$syslogfacility-text == 'local6' \
and $syslogseverity-text == 'info' \
and ($msg contains_i 'match1' or $msg contains_i 'match2' ) \
and not ( $msg contains_i 'test1' or $msg contains_i 'test2' ) \
then /var/log/my.log;myFormat
$ActionFileDefaultTemplate myFormat
if \
$syslogfacility-text == 'local6' \
and $syslogseverity-text == 'info' \
and ($msg contains_i 'match1' or $msg contains_i 'match2' ) \
and not ( $msg contains_i 'test1' or $msg contains_i 'test2' ) \
then /var/log/my.log;myFormat
◆ rsyslogその他設定(転送元、転送先共通)
# mkdir /var/spool/rsyslog/
# cp /etc/sysconfig/rsyslog /etc/sysconfig/rsyslog.default
# vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 5"
◆ 確認
# /etc/init.d/rsyslog restart
起動後ポートが開くことを確認する。
# netstat -an | grep 514
iptablesでフィルタの状態もあわせて確認しておく。
# iptables -nvL
◆ 試験
転送元からloggerコマンドを使いメッセージを送る、
# logger -p local6.info "host1"
転送先にメッセージが到達していることを確認する。
※除外させることにした"test:"は送ってもログに出力されない。
# tail -f /var/log/rsyslog-local6.log
また、転送しないログは送信側で受け取れていることも確認する。
# tail -f /var/log/messages