22.3. 新規設定フォーマットの使用

rsyslog パッケージの Red Hat Enterprise Linux 7 に対してデフォルトでインストールされる rsyslog バージョン 7 では、新しい設定構文が導入されました。この新しい設定形式の目的は、より強力かつ直感的なものにすることと、特定の無効なコンストラクトを許可しないことによりよくあるミスを防ぐことです。この構文の拡張は、RainerScript に依存する新たな設定プロセッサーによって可能になります。以前の形式は引き続き完全にサポートされ、/etc/rsyslog.conf 設定ファイルでデフォルトで使用されます。
RainerScript は、ネットワークイベントの処理と rsyslog などのイベントプロセッサーの設定用に設計されたスクリプト言語です。RainerScript は最初に、式ベースのフィルターを定義するために使用されました (例22.3「式ベースのフィルター」 を参照)。rsyslogバージョン 7 の RainerScript のバージョンは、input() ステートメントおよび ruleset() ステートメントを実装し、/etc/rsyslog.conf 設定ファイルは新しい構文で記述できます。新しい構文は、主に構造化が強化されているという点で異なります。パラメーターは、入力、アクション、テンプレート、モジュールロードなどのステートメントへの引数として渡されます。オプションのスコープはブロックにより制限されます。これにより、可読性が増し、設定の間違えによって発生するバグの数が減ります。また、パフォーマンスが大幅に増加する利点があります。一部の機能は両方の構文で公開され、一部の機能は新しい構文でのみ公開されます。
以前のスタイルのパラメーターで記述された設定を比較します。
$InputFileName /tmp/inputfile
$InputFileTag tag1:
$InputFileStateFile inputfile-state
$InputRunFileMonitor
同じ設定を新たなフォーマットステートメントを使用すると、以下のようになります。
input(type="imfile" file="/tmp/inputfile" tag="tag1:" statefile="inputfile-state")
これにより、設定で使用されるパラメーター数が大幅に削減され、読みやすさが向上するとともに、実行速度も速まります。RainerScript ステートメントおよびパラメーターに関する詳細な情報は、「オンラインのドキュメント」 を参照してください。

22.3.1. ルールセット

特定なディレクティブを除いて、rsyslog は、フィルター条件と、条件が当てはまる場合に実行されるアクションで構成される rules で定義したようにメッセージを処理します。従来の /etc/rsyslog.conf ファイルでは、すべてのルールは、どの入力メッセージにおいても表示順に評価されます。このプロセスは最初のルールで開始し、すべてのルールが処理されるか、ルールのいずれかがメッセージを破棄するまで続きます。
ただし、ルールはルールセットと呼ばれるシーケンスにグループ化できます。このルールセットでは、特定のルールの効果を選択された入力のみに制限したり、特定の入力にバインドした明確なアクションセットを定義することで rsyslog のパフォーマンスを強化したりできます。つまり、特定の種類のメッセージでは必然的に false と評価されるフィルター条件をスキップできます。/etc/rsyslog.conf 内の以前のルールセット定義は以下のようになります。
$RuleSet rulesetname
rule
rule2
ルールは、別のルールが定義されたとき、または以下のようにデフォルトのルールセットが呼び出されたときに終了します。
$RuleSet RSYSLOG_DefaultRuleset
rsyslog 7 の新しい設定形式では、この操作のために input() ステートメントおよび ruleset() ステートメントが予約されます。/etc/rsyslog.conf の新しい形式のルールセット定義は以下のようになります。
ruleset(name="rulesetname") { 
      rule
      rule2
      call rulesetname2
      … 
}
rulesetname を、使用する ruleset の識別子で置き換えます。ruleset 名は RSYSLOG_ で開始することはできません。このネームスペースが rsyslog の使用のために確保されているためです。そして、メッセージに他の ruleset が割り当てられていない場合に実行されるデフォルトのルール一式を RSYSLOG_DefaultRuleset が定義します。rulerule2 では、上記で説明したフィルター-アクションのフォーマットでルールを定義できます。call パラメーターでは、他の ruleset ブロック内から ruleset を呼び出すことでこれらをネスト化できます。
ruleset の作成後は、これが適用される入力を指定する必要があります。
input(type="input_type" port="port_num" ruleset="rulesetname");
ここでは、メッセージを収集する入力モジュールである input_type か、ポート番号である port_num で入力メッセージを特定できます。filetag といった他のパラメーターは、input() 用に指定できます。rulesetname を、メッセージに対して評価する ruleset 名で置き換えます。入力メッセージが明示的に ruleset にバインドされていない場合は、デフォルトの ruleset が適用されます。
レガシーフォーマットを使用して ruleset を定義することもできます。詳細は 「オンラインのドキュメント」 を参照してください。

例22.11 ruleset の使用

以下の ruleset は、異なるポートからのリモートメッセージが確実に異なる方法で処理されるようにします。以下を /etc/rsyslog.conf に追加します。
ruleset(name="remote-6514") {
    action(type="omfile" file="/var/log/remote-6514")
}

ruleset(name="remote-601") {
    cron.* action(type="omfile" file="/var/log/remote-601-cron")
    mail.* action(type="omfile" file="/var/log/remote-601-mail")
}

input(type="imtcp" port="6514" ruleset="remote-6514");
input(type="imtcp" port="601" ruleset="remote-601");
上記の例の ruleset は、2 つのポートからのリモート入力のログの行き先を定義しています。ポート 601 の場合、メッセージはファシリティーに従って分けられます。そして、TCP 入力が有効になり、ruleset にバインドされます。この設定が機能するには、必須モジュール (imtcp) の読み込みが必要なことに注意してください。

22.3.2. sysklogd との互換性

-c オプションで指定される互換性モードは、rsyslog バージョン 5 で存在しますが、バージョン 7 では存在しません。また、syslogd スタイルのコマンドラインオプションは非推奨となり、このコマンドラインオプションを使用した rsyslog の設定も可否すべきです。ただし、複数のテンプレートとディレクティブを使用して syslogd のような動作をエミュレートするために rsyslogd を設定することができます。
rsyslogd オプションの詳細情報は、man ページ rsyslogd(8) を参照してください。