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)
厳密にはアクションの 1 つだがここに。
フィルタ ~
メッセージは破棄され、これ以降のアクションは実行されない。
テンプレート
メッセージの出力形式をアクション単位で指定できる。
$template MyTemplate,"%TIMESTAMP% ..." *.info /var/log/messages;Mytemplate *.err /var/log/error
- ファシリティ・プライオリティを syslogd の -SS オプションのように出力する
$template MySSTemplate,"%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
- デフォルトのテンプレートを変更する
$ActionFileDefaultTemplate MyTemplate
フィルタ
セレクタ
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
アクション
ファイル出力
- 基本的には "/" から始まる絶対パスを指定する。
- 最初に "-" を付けると sync しない。
- 動的にファイル・ディレクトリを作成して出力できる。
*.* -/var/log/async.log $template DynFile,"/var/log/%HOSTNAME%/%programname%.log" *.* ?DynFile
名前付きパイプ
- 最初に "|" を付けて名前付きパイプを指定できる。
- rsyslogd を起動する前に mkfifo しておかなければならない。
*.* |/tmp/mylogpipe
リモートホスト
- 最初に "@" で UDP 送信、"@@" で TCP 送信
- 圧縮オプション "(z[1-9])" もある
*.* @192.168.1.1:514 *.* @@192.168.1.2:514 *.* @(z9)192.168.1.3
- sysklogd に送信する場合は、デフォルトのテンプレートだと問題があるため以下を使用する
$template sysklogd,"<%PRI%>%TIMESTAMP% %syslogtag%%msg%\"" *.* @192.168.1.1;sysklogd
ユーザリスト
- omusrmsg ビルトインモジュールを使う
- "*" を指定すれば全員へ
*.crit :omusrmsg:root,hagio *.emerg :omusrmsg:*
シェル実行
- サブシェルでプログラムが実行される。
- テンプレートで生成されたメッセージがプログラムの引き数として渡される。
*.* ^program;template