rsyslog  特定のログに対するフィルタ
同じWarningのログであっても、監視すべきログと監視不要なログというものがある。
しかし、従来のファシリティ/プライオリティベースでのフィルタでは、ログごとの制御ができない。
そこで、同じプライオリティのログであっても、ログごとに制御(別のファイルへ記録、破棄など)できる
プロパティベースもしくは式ベースのフィルタ機能を使用する。
このページではsyslogサーバ側でフィルタをしているが、できるのであれば、送信側のrsyslogで同じような
設定をすることによって不要なログの転送を止めた方が良い。
※syslogサーバ側でフィルタした理由は、送信側がルータ/スイッチでログごとの制御ができない、特殊な
ロギングを使っている、rsyslogを使っていない、送信元機器が多いなどの理由からである。
■ 式ベースのフィルタ機能
式ベースのフィルタとは、if〜thenを使ったフィルタ方式のことである。
プロパティベースと比較して、複数のフィルタ条件の指定ができるメリットがある。
フィルタは1行で書く必要がある。 1行で書けない場合は \ を使って行の続きとみなすことができる。
[基本的な書式]
if $プロパティ コンペアオペレーション '文字列' then  ログファイル名
$プロパティ
 比較対象とするもの
[主なプロパティ]
msg  ログメッセージ
hostname  ホスト名
fromhost  ログを送信したホストのホスト名
fromhost-ip ログを送信したホストのIPアドレス
syslogfacility  ファシリティ(数字)
syslogfacility-text  ファシリティ(テキスト)
syslogseverity  プライオリティ(数字)
syslogseverity-text  プライオリティ(テキスト)
$now  現在時刻(書式:YYYY-MM-DD)
$year  現在の年(4けた)
$month  現在の月(2けた)
$day  現在の日(2けた)
$hour  現在の時(24時間表記、2けた)
$minute  現在の分(2けた)
コンペアオペレーション
 比較
contains  '文字列'がプロパティの一部にマッチするかどうか
isequal  '文字列'がプロパティと完全にマッチするかどうか
startswith  '文字列'がプロパティの先頭にマッチするかどうか
regex  正規表現の'文字列'がプロパティとマッチするかどうか
(今は使えないらしい)
ereregex  拡張正規表現の''文字列'がプロパティとマッチするかどうか 
(今は使えないらしい)
! コンペアオプションの前に付けることで否定になる
'文字列'
 プロパティを比較するときの文字列で、' ' で囲む(プロパティベースでは" "になる)。
 また、大文字と小文字は区別される。
[使用例]
if $msg contains 'test' then /var/log/local1.log ログメッセージにtestが含まれている場合は、
/var/log/local1.logに出力
if $msg !contains 'test' then /var/log/local1.log ログメッセージにtestが含まれていない場合は、
/var/log/local1.logに出力
if $hostname isequal 'centos62' then /var/log/local2.log ホスト名がcentos62のログは、/var/log/local2.logに出力
if ($hostname isequal 'centos62' and $msg contains 'test' \ ホスト名がcentos62でかつログメッセージにtestが
then /dev/null 含まれている場合は、ログを破棄する
行が長い場合は、\を使って1行とみなすことができる
フィルタ設定前の状態
現在のrsyslogサーバの設定では、同じメッセージを複数のファイルに記録してしまう。
また、監視する必要のないログであってもWarningレベルであるため、記録をしてしまう。
rsyslogサーバ側の現在の設定
# egrep -v "^#|^$" /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) rsyslogは上から順番にルールをチェックし、
$ModLoad imklog   # provides kernel logging support (previously done by rklogd) マッチしたルールがあってもそこで終わらずに、
$ModLoad imudp 最後までチェックする
$UDPServerRun 514
$AllowedSender UDP, 127.0.0.1, 192.168.24.0/24, *.example.co.jp そのため、ルールの書き方によってはログが複数のファイルに
$ModLoad imtcp 記録されることがよくある
$InputTCPServerRun 514
$AllowedSender TCP, 127.0.0.1, 192.168.24.0/24, *.example.co.jp
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
local7.*                                                /var/log/boot.log
local0.*                                                /var/log/bigip/local0.log
local4.*                                                /var/log/bigip/local4.log
local2.*                                                /var/log/bigip/bigip.log
local3.*                                                /var/log/bigip/bigip.log
$template temp1,"/var/log/template.log"
local1.*                                               ?temp1
if $msg contains 'testmessage' then \ メッセージについては、大文字と小文字の区別あり
                                                /var/log/property.log testmessageはマッチするが、TESTmessageはマッチしない
外部サーバから、 # logger -p local1.warn "testmessage" を実行した結果
# tail /var/log/messages 3つのファイルに記録されるようになっている
Aug 14 17:09:03 vm-centos62 test1000: testmessage
# tail /var/log/template.log
Aug 14 17:09:03 vm-centos62 test1000: testmessage
# tail /var/log/property.log
Aug 14 17:09:03 vm-centos62 test1000: testmessage
rsyslogサーバのローカル上から、 # logger -p local1.warn "testmessage 01" を実行した結果
# tail /var/log/messages 3つのファイルに記録されるようになっている
Aug 14 17:14:48 vm-centos62B test1000: testmessage 01
# tail /var/log/template.log
Aug 14 17:14:48 vm-centos62B test1000: testmessage 01
# tail /var/log/property.log
Aug 14 17:14:48 vm-centos62B test1000: testmessage 01
1. ログを特定のファイルだけに記録したい
目的:
外部サーバからの"testmessage"を含むログについては、/var/log/property.logだけに記録したい
設定の変更
# vi /etc/rsyslog.conf
(省略)
#### RULES #### プロパティの設定を上位に移動し、かつfromhost-ipで
if $fromhost-ip == '192.168.24.133' and $msg contains 'testmessage' then \ 転送元IPアドレスを外部アドレスを指定する
                                                /var/log/property.log (ローカルのメッセージは対象外とさせる)
& ~
# Log all kernel messages to the console. &は、複数のアクションを指定する場合に指定する
# Logging much else clutters up the screen. ~は、メッセージの破棄を意味する
#kern.*                                                 /dev/console つまり、& ~ をいれると、その条件(今回はif〜then)にマッチ
したものは、/var/log/property.logに出力され、次に~(破棄)
# Log anything (except mail) of level info or higher. される
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure ※ $fromhost-ipのフィルタを除外すると、ローカルからの
(省略)   同様のメッセージもproperty.logに記録される
$template temp1,"/var/log/template.log"
local1.*                                               ?temp1
# /sbin/rsyslogd -N 1 -c 5 構文チェック
# service rsyslog restart 設定の反映 (rsyslogの再起動)
確認
外部サーバから、 # logger -p local1.warn "testmessage 02" を実行した結果
# tail /var/log/property.log property.logにしか記録されていない
Aug 14 17:26:06 vm-centos62 test1000: testmessage 02
# tail /var/log/messages
# tail /var/log/template.log
syslogサーバのローカル上から、 # logger -p local1.warn "testmessage 03" を実行した結果
# tail /var/log/property.log property.log以外のmessages , template.logに記録されている
# tail /var/log/messages
Aug 14 17:27:11 vm-centos62B test1000: testmessage 03
# tail /var/log/template.log
Aug 14 17:27:11 vm-centos62B test1000: testmessage 03
2. 特定のログをどのファイルにも記録しない(破棄したい)
目的:
"testmessage"を含むログについては、破棄する。
設定の変更
# vi /etc/rsyslog.conf
(省略)
#### RULES ####
if $msg contains 'testmessage' then            ~ ログメッセージにtestmessagesが含まれている場合は、
ログを破棄する
# Log all kernel messages to the console. ~は、ログの破棄を意味するアクションの一つ
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
ログがこの時点で破棄されるのでその他のルールが
# Log anything (except mail) of level info or higher. 適用されることはない
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
※ $from-ipのフィルタを加えることで特定のサーバからの
# The authpriv file has restricted access.    ログだけを対象にすることができる
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
(省略)
$template temp1,"/var/log/template.log"
local1.*                                               ?temp1
# /sbin/rsyslogd -N 1 -c 5 構文チェック
# service rsyslog restart 設定の反映 (rsyslogの再起動)
確認
外部サーバから、 # logger -p local1.warn "testmessage 04"  を実行した結果
# tail /var/log/messages
# tail /var/log/template.log
syslogサーバのローカル上から、 # logger -p local1.warn "testmessage 05"  を実行した結果
# tail /var/log/messages
# tail /var/log/template.log
外部サーバから、 # logger -p local1.warn "test" を実行した結果
# tail /var/log/messages messages , template.logには記録されている
Aug 14 17:39:28 vm-centos62 test1000: test
# tail /var/log/template.log
Aug 14 17:39:28 vm-centos62 test1000: test
syslogサーバのローカル上から、 # logger -p local1.warn "test" を実行した結果
# tail /var/log/messages messages , template.logには記録されている
Aug 14 17:40:45 vm-centos62B test1000: test
# tail /var/log/template.log
Aug 14 17:40:45 vm-centos62B test1000: test
3. 複数の特定のログをどのファイルにも記録しない(破棄したい)
目的:
外部サーバからのログのうち、複数の特定のログを破棄したい。
設定の変更
# more /etc/rsyslog.conf /etc/rsyslog.confの中で、
(省略) RULESよりも上で/etc/rsyslog.d/*.confを読み込む設定に
# Include all config files in /etc/rsyslog.d/ なっている
$IncludeConfig /etc/rsyslog.d/*.conf (ちなみにバージョンはrsyslogd 5.8.10だった)
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
(省略)
# vi /etc/rsyslog.d/filter.conf /etc/rsyslog.d/の下に適当な.confファイルを作成し、
if \ ここにフィルタ条件を書いていく
($fromhost-ip == '192.168.24.133' and $msg contains 'test') or \
($fromhost-ip == '192.168.24.133' and $msg contains 'Warning:' and \ フィルタ条件を or の後に続けて書いていく
 $msg contains '@hotmail.com') \
then \
~ ~はログの破棄をあらわす
# /sbin/rsyslogd -N 1 -c 5 構文チェック
# service rsyslog restart rsyslogの再読み込み(再起動)
確認
外部サーバからいろいろなメッセージを流してみた結果
# logger -p local1.warn "atestc" testを含んでいるので対象
# logger -p local1.warn "a testc" 同上
# logger -p local1.warn "a Testc" Testなので対象外(大文字、小文字の区別あり)
# logger -p local1.warn "aTestc" 同上
# logger -p local1.warn "tes" tが足りないので対象外
# logger -p local1.warn "Warning" :が足りないので対象外
# logger -p local1.warn "Warning:" Warning:だけでも対象外
# logger -p local1.warn "Warning: " 同上
# logger -p local1.warn "Warning: admin@hotmail.com" Warning:と@hotmail.comがあるので対象
# logger -p local1.warn "Warning: admin@hotmail.co" mが足りないので対象外
# tail /var/log/messages 対象外となったものは、messagesやtemplate.logには
Aug 14 19:55:13 vm-centos62 test1000: a Testc 記録されている
Aug 14 19:55:17 vm-centos62 test1000: aTestc
Aug 14 19:55:34 vm-centos62 test1000: tes
Aug 14 19:55:41 vm-centos62 test1000: Warning
Aug 14 19:55:45 vm-centos62 test1000: Warning:
Aug 14 19:55:49 vm-centos62 test1000: Warning:
Aug 14 19:56:20 vm-centos62 test1000: Warning: admin@hotmail.co
# tail /var/log/template.log
Aug 14 19:55:13 vm-centos62 test1000: a Testc
Aug 14 19:55:17 vm-centos62 test1000: aTestc
Aug 14 19:55:34 vm-centos62 test1000: tes
Aug 14 19:55:41 vm-centos62 test1000: Warning
Aug 14 19:55:45 vm-centos62 test1000: Warning:
Aug 14 19:55:49 vm-centos62 test1000: Warning:
Aug 14 19:56:20 vm-centos62 test1000: Warning: admin@hotmail.co
■ プロパティベースのフィルタ機能
プロパティベースのフィルタとは、プロパティによるフィルタ方式であり、行頭が:(コロン)で始まる。
使用するプロパティやコンペアオペレーションは、式ベースと同じである。
式ベース(if〜then)との違いは、プロパティに$を付けないこと、プロパティとコンペアオペレーションと値を、,(カンマ)で区切ること、
値は" "(ダブルクォーテーション)で囲むこと、フィルタ条件が1つしか設定できないことである。
[基本的な書式]
:プロパティ,コンペアオペレーション,"値"  ログファイル名
[使用例]
:msg, contains, "test"         /var/log/local1.log ログメッセージにtestが含まれている場合は、
/var/log/local1.logに出力
:msg, !contains, "test"         /var/log/local1.log ログメッセージにtestが含まれていない場合は、
/var/log/local1.logに出力
:msg, contains, "test"        ~ ログメッセージにtestが含まれている場合は、
ログを廃棄
~は、ログの破棄を意味する。
:hostname, isequal, "centos62"         /var/log/local2.log ホスト名がcentos62のログは、/var/log/local2.logに出力
[設定例]
# vi /etc/rsyslog.conf
(省略)
#### RULES ####
:msg, contains, "testmessage"                           ~ ログメッセージにtestmessageが含まれている場合は廃棄。
$template temp1, "/var/log/host/%hostname%.log" templateでログファイルのテンプレートを作成
:hostname, isequal, "vm-centos62"                       ?temp1 vm-centos62からのログメッセージは、
                                                        & ~ /var/log/host/vm-centos62.logに出力した後、ログを廃棄。
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
(省略)
$template temp2,"/var/log/template.log"
local1.*                                               ?temp2
# /sbin/rsyslogd -N 1 -c 5 文法チェック
rsyslogd: version 5.8.10, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
# service rsyslog restart 設定の反映 (rsyslogの再起動)
確認
vm-centos62サーバから、$ logger -p local1.warn "this is a testmessage. これはテストメッセージです。" を実行した結果。
# tail /var/log/host/vm-centos62.log どのファイルにも記録なし
# tail /var/log/messages
# tail /var/log/template.log
確認
vm-centos62サーバから、$ logger -p local1.warn "this is a testlog. これはテストログです。" を実行した結果。
# tail /var/log/host/vm-centos62.log vm-centos62.logが自動的に作成され、ログが記録されている
Sep  6 14:55:07 vm-centos62 test1000: this is a testlog. これはテストログです。
# tail /var/log/messages 他の2つには記録なし
# tail /var/log/template.log
確認
192.168.24.140(vm-solaris10)から、# logger -p local1.warn "this is a testlog." を実行した結果。
# ls -l /var/log/host | egrep '192|solaris' そもそもファイルは作られない
# tail /var/log/messages 他の2つには記録あり。
Sep  6 15:21:12 192.168.24.140 hiro0308: [ID 702911 local1.warning] this is a testlog.
# tail /var/log/template.log
Sep  6 15:21:12 192.168.24.140 hiro0308: [ID 702911 local1.warning] this is a testlog.