Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

25.3.2. アクション

アクションは、明確に定義されたセレクターでフィルターされたメッセージで何を実行するかを指定します。以下にルール内で定義できるアクションをいくつか示します。
ログファイルへの syslog メッセージの保存
アクションの大半は、どのログファイルに syslog メッセージを保存するかを指定します。これは定義済みセレクターの後にファイルパスを指定することで行います。
FILTER PATH
ここでの FILTER はユーザーが指定したセレクターを表し、PATH はターゲットファイルのパスを表します。
たとえば、以下のルールは、すべての cron syslog メッセージを選択するセレクターと、それらを /var/log/cron.log ログファイルに保存するアクションで構成されています。
cron.* /var/log/cron.log
デフォルトでは、syslog メッセージの生成時に毎回ログファイルは同期されます。同期を省略する場合は、ダッシュ記号 (-) を該当するファイルパスの接頭辞として使います。
FILTER -PATH
書き込みの直後にシステムが終了すると、情報が失われる場合があることに注意してください。ただし、この設定では、特に非常に詳細なログメッセージを生成するプログラムを実行する場合には、パフォーマンスも改善されます。
指定したファイルパスは、static または dynamic のいずれかになります。静的ファイルは、上記の例で示されているように固定ファイルパスで示されます。動的ファイルパスは、受け取ったメッセージによって異なります。動的ファイルパスは、テンプレートと疑問符 (?) の接頭辞で示されます。
FILTER ?DynamicFile
ここでは、DynamicFile は出力パスを変更する事前定義テンプレートの名前です。ダッシュ記号 (-) の接頭辞を使うと同期を無効にでき、またコロン (;) 区切りで複数のテンプレートを使用できます。テンプレートに関する詳細は 「動的なファイル名の生成」 を参照してください。
指定したファイルが既存の terminal または /dev/console デバイスである場合、syslog メッセージは標準出力(特別な terminal処理を使用)へ送信されるか、X Window システムの使用時には(特別な /dev/console-handling を使用)標準出力に送信されます。
ネットワークを使った syslog メッセージの送信
rsyslog を使用すると、ネットワーク経由で syslog メッセージを送受信できます。この機能により、1 台のマシンで複数ホストの syslog メッセージを管理できます。syslog メッセージをリモートマシンに転送するには、以下の構文を使用します。
@[(zNUMBER)]HOST:[PORT]
詳細は以下のようになります。
  • アットマーク(@)は、syslog メッセージが UDP プロトコルを使用してホストへ転送されることを示します。TCP プロトコルを使用するには、2 つのアットマークを空白なしで使用します(@@)
  • オプションの zNUMBER 設定を使用すると、syslog メッセージの zlib 圧縮が可能になります。NUMBER 属性は圧縮のレベルを指定します(最低 1 から 9 まで)。圧縮が得られた値は rsyslogd によって自動的にチェックされます。メッセージが圧縮されるのは圧縮され、60 バイト未満のメッセージは圧縮されません。
  • HOST 属性は、選択した syslog メッセージを受信するホストを指定します。
  • PORT 属性は、ホストマシンのポートを指定します。
IPv6 アドレスをホストとして指定する場合は、アドレスを角括弧([, ])で囲みます。

例25.4 ネットワークを使用した syslog メッセージの送信

以下の例は、ネットワーク上で syslog メッセージを転送するアクションです (注記: すべてのアクションの前には、いずれかの優先度を持つすべてのメッセージを選択するセレクターが付いています)。UDP プロトコルを介してメッセージを 192.168.0.1 に転送するには、以下を入力します。
*.* @192.168.0.1
ポート 6514 と TCP プロトコルを使用してメッセージを "example.com" に転送するには、以下を使用します。
*.* @@example.com:6514
以下ではメッセージを zlib (レベル 9 圧縮)で圧縮し、UDP プロトコルを使用して 2001:db8::1 に転送します。
*.* @(z9)[2001:db8::1]
出力チャンネル
出力チャンネルは主にログファイルの最大サイズを指定するために使用されます。これは、ログファイルのローテーションに非常に便利です (詳細は 「ログローテーション」 を参照してください)。出力チャンネルは基本的に出力アクションに関する情報を集めたものです。出力チャンネルは、$outchannel ディレクティブで定義されます。/etc/rsyslog.conf で出力チャンネルを定義するには、以下の構文を使用します。
$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION
詳細は以下のようになります。
  • NAME 属性は、出力チャンネル名を指定します。
  • FILE_NAME 属性は、出力ファイル名を指定します。出力チャンネルはファイルにのみ書き込み可能で、パイプやターミナル、その他の出力には書き込みできません。
  • MAX_SIZE 属性は、( FILE_NAME内の)指定されたファイルの最大サイズを表します。この値は バイト 単位で指定します。
  • ACTION 属性は、MAX_SIZE で定義された最大サイズに達すると実行するアクションを指定します。
定義済みの出力チャンネルをルール内のアクションとして使用するには、以下を入力します。
FILTER :omfile:$NAME

例25.5 出力チャンネルのログローテーション

以下の出力は、出力チャンネルを使用した簡単なログローテーションを示しています。まず、出力チャンネルは $outchannel ディレクティブで定義されます。
 $outchannel log_rotation, /var/log/test_log.log, 104857600, /home/joe/log_rotation_script
その後に、優先度を持つすべての syslog メッセージを選択し、取得した syslog メッセージ上の事前定義された出力チャンネルを実行するルール内で使用されます。
*.* :omfile:$log_rotation
制限(この例では 100 MB)に達すると、/home/joe/log_rotation_script が実行されます。このスクリプトには、ファイルを異なるフォルダーに移動することやその中の特別なコンテンツを編集すること、単にそれを削除することなど、様々なタスクを含めることができます。
特定ユーザーへの syslog メッセージの送信
Rsyslog は、( 例25.7「複数アクションの指定」のように)メッセージを送信するユーザーのユーザー名を指定することで、syslog メッセージを特定のユーザーに送信できます。複数のユーザーを指定するには、各ユーザー名をコンマ (,) で区切ります。現在ログオンしている全ユーザーにメッセージを送るには、アスタリスク (*) を使用します。
プログラムの実行
rsyslog を使用すると、選択した syslog メッセージに対してプログラムを実行し、system() 呼び出しを使用してシェルでプログラムを実行できます。実行するプログラムを指定するには、そのプログラムの前に キャレット文字(^) を付けます。その後に、受信したメッセージをフォーマットしてそれを 1 行のパラメーターとして指定した実行ファイルに渡すテンプレートを指定します (テンプレートに関する詳細は 「テンプレート」 を参照)。
FILTER ^EXECUTABLE; TEMPLATE
ここでは、FILTER 条件の出力は EXECUTABLE で表されるプログラムによって処理されます。このプログラムは、有効な実行ファイルであればどれでも構いません。TEMPLATE をフォーマットするテンプレートの名前に置き換えます。

例25.6 プログラムの実行

以下の例では、すべての優先度の syslog メッセージが選択され、template テンプレートでフォーマットされ、パラメーターとして test-program プログラムに渡されます。その後、提供されているパラメーターで実行されます。
*.* ^test-program;template
シェル実行アクションを使用する場合は注意してください。
ホストからメッセージを受信して、シェル実行アクションを使用する際には、コマンドインジェクションに対する脆弱性があります。ユーザーが自身のアクションで実行されるように指定しているプログラム内で、攻撃者が別のコマンドの挿入と実行を試みる可能性があります。セキュリティー脅威の可能性を回避するには、シェル実行アクションの使用をよく検討してください。
syslog メッセージのデータベースでの保存
選択された syslog メッセージは、データベースライター の動作を使用して、直接データベーステーブルに書き込むことができます。データベースライターは、以下の構文を使用します。
:PLUGIN:DB_HOST,DB_NAME,DB_USER,DB_PASSWORD;[TEMPLATE]
詳細は以下のようになります。
  • PLUGIN はデータベースの書き込みを処理する指定プラグインを呼び出します( ommysql プラグインなど)。
  • DB_HOST 属性はデータベースのホスト名を指定します。
  • DB_NAME 属性はデータベースの名前を指定します。
  • DB_USER 属性はデータベースユーザーを指定します。
  • DB_PASSWORD 属性は上記のデータベースユーザーで使用されるパスワードを指定します。
  • TEMPLATE 属性は syslog メッセージを変更するテンプレートのオプション使用を指定します。テンプレートに関する詳細は 「テンプレート」 を参照してください。
MySQL および PostgreSQL の使用
現在、rsyslogMySQL および PostgreSQL データベースにのみ対応しています。MySQL および PostgreSQL のデータベースライター機能を使用するには、rsyslog-mysql および rsyslog-pgsql パッケージをそれぞれインストールします。また、/etc/rsyslog.conf 設定ファイルに適切なモジュールを読み込んでください。
$ModLoad ommysql    # Output module for MySQL support
$ModLoad ompgsql    # Output module for PostgreSQL support
rsyslog モジュールの詳細は、「Rsyslog モジュールの使用」 を参照してください。
または、omlibdb モジュールが提供する汎用のデータベースインターフェースを使用することもできます(サポート対象: Firebird/Interbase、MS SQL、Sybase、SQLLite、Ingres、Oracle、mSQL)。
syslog メッセージの破棄
選択したメッセージを破棄する場合は、チルダ文字(~)を使用します。
FILTER ~
破棄するアクションは、ほとんどの場合、さらに処理をする前にメッセージをフィルタリングするために使用されます。繰り返されるメッセージを省略しなければログファイルがいっぱいになってしまう場合に、これは効果的です。破棄アクションの結果は、指定された設定ファイル内の場所によって異なります。最善の結果を得るためにも、これらのアクションは、アクションリストの上に配置します。一旦破棄したメッセージを、設定ファイルの後の行で回復することはできないことに注意してください。
たとえば、以下のルールは cron syslog メッセージを破棄します。
cron.* ~

複数アクションの指定

各セレクターで、複数のアクションを指定できます。1 つのセレクターに複数アクションを指定するには、各アクションを別々の行に書き込んでそれらの先頭にアンパサンド文字 (&) を付けます。
FILTER ACTION
& ACTION
& ACTION
指定されたセレクターが評価されるのは 1 回のみであるため、複数の動作を指定すると、希望する結果の全体的なパフォーマンスが向上します。

例25.7 複数アクションの指定

以下の例では、重要な優先度(crit)を持つすべてのカーネル syslog メッセージはユーザー user1 に送信され、テンプレート temp によって処理され、test-program 実行可能ファイルに渡され、UDP プロトコルを介して 192.168.0. 1 に転送されます。
kern.=crit user1
& ^test-program;temp
& @192.168.0.1
すべてのアクションで、メッセージをフォーマットするテンプレートが後に続きます。テンプレートを指定するには、アクションの末尾にセミコロン (;) を付け、続けてテンプレートの名前を指定します。テンプレートに関する詳細は 「テンプレート」 を参照してください。
テンプレートの使用
テンプレートはアクションで使用される前に定義する必要があり、アクションの後に定義しても無視されます。つまり、/etc/rsyslog.conf では、テンプレート定義が常にルール定義の前にくるようにする必要があります。