Rsyslog
提供: Wikinote
結構、設定がわかりにくいのであるよ。
目次
設定
CentOS 6.4 の rsyslog-5.8.10 に含まれるマニュアルを読んで調べたものだが、 すべて試したわけではないので、実際に使えるかどうかはそれぞれの環境で要確認。
モジュール
$ModLoad でモジュールを読み込む。
UDP あるいは TCP ソケットで待ち受ける
syslogd では UDP のみに対応しており -r オプションだったが、 rsyslog ではオプションではなく rsyslog.conf に記述する。
$ModLoad imudp $UDPServerRun 514 $ModLoad imtcp $InputTCPServerRun 514
基本構文
syslogd と同様に以下が基本。フィルタとアクションの区切りはスペースかタブ文字を使用できる。
フィルタ アクション
- 複数のアクションを適用する
フィルタ アクション1 & アクション2 & アクション3
- それ以降の処理をやめる (discard)
フィルタ ~
フィルタ
セレクタ
syslogd と同じ伝統的な形式。
facility.priority
- facility
- 主に:auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, local0 - local7
- priority
- 主に:debug, info, notice, warning, err, crit, alert, emerg
主なルール
- 指定した priority 以上のログにマッチする
- アスタリスク (*) ですべての facility あるいは priority にマッチ
- セミコロン (;) で複数のセレクタを指定可能
- none で対象 facility を除外可能
- コンマ (,) で複数の facility を指定可能
- イコール (=) で特定の priority のみにマッチ
- エクスクラメーションマーク (!) で priority 以上を無視
daemon.err # daemon の err, crit, alert, emerg にマッチ mail.* # mail のすべてのログにマッチ *.emerg # すべての emerg のログにマッチ *.* # すべてのログにマッチ daemon.warning;cron.err *.*;mail.none # mail 以外のすべてのログにマッチ uucp,news.crit # uucp と news の crit, alert, emerg にマッチ daemon.=err # daemon の err のみにマッチ daemon.notice;daemon.!err # daemon の notice と warning のみマッチ?(試してない)
プロパティベース フィルタ
rsyslogd 独自のフィルタ。
:property, [!]compare-operation, "value"
property
主なプロパティは以下。
- msg
- メッセージ本体 (MSG)
- hostname
- ホスト名
- fromhost, fromhost-ip
- メッセージを送信したホスト名 or IP アドレス
- syslogtag
- タグ部分 (TAG) (例:"kernel:", "ntpd[xxx]:")
- programname
- タグ中の名前部分 (例:"kernel", "ntpd")
- syslogfacility-text
- ファシリティ名
- syslogpriority-text
- プライオリティ名
- timegenerated
- メッセージを受信した日時
- timestamp (timereported)
- メッセージのタイムスタンプ
compare-operations
以下があるらしいが全部は試していない。
- contains
- 文字列が含まれているかどうか。ワイルドカードは使用不可。
- isequal
- exact マッチ
- startswith
- 指定した文字列から始まるかどうか。
- regex
- POSIX BRE
- ereregex
- POSIX ERE
マニュアルによると、正規表現を使わなくて良いのであればそちらの方が速い。
正規表現のサンプル:
:msg, regex, "fatal .* error"
value
- クォートされた文字列を指定する。
- エスケープシーケンス使用可 (\" でダブルクォート、\\ でバックスラッシュ)
評価式ベース フィルタ
日本語の名称は勝手に付けたものなので悪しからず。
if expr then アクション
- すべて 1 行に記載しなければならない。
- 正規表現には対応していない。
- RainerScript というもので実装されているよう。マニュアル参照。
設定例:
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog
フォーマット
- ファシリティ・プライオリティを syslogd の -SS オプションのように出力する
$template MyFormat,"%TIMESTAMP% <%syslogfacility-text%.%syslogpriority-text%> %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" 例) Apr 19 08:04:08 <user.notice> courier hagio: test