Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
23.2.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
処理を使用) へそれぞれ送信されます。- ネットワークを使った 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
アドレスをホストとして指定する場合は、アドレスを角括弧 ([
,]
) で囲みます。例23.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
例23.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 は syslog メッセージを送信することができます (例23.7「複数アクションの指定」 で表示)。複数のユーザーを指定するには、各ユーザー名をコンマ (
,
) で区切ります。現在ログオンしている全ユーザーにメッセージを送るには、アスタリスク (*
) を使用します。 - プログラムの実行
rsyslog を使用すると、選択した syslog メッセージに対してプログラムを実行でき、
system()
呼び出しを使用してシェルでプログラムを実行できます。実行するプログラムを指定するには、そのプログラムの前に キャレット文字 (^
) を付けます。その後に、受信したメッセージをフォーマットしてそれを 1 行のパラメーターとして指定した実行ファイルに渡すテンプレートを指定します (テンプレートに関する詳細は 「テンプレート」 を参照)。FILTER ^EXECUTABLE; TEMPLATE
ここでは、FILTER 条件の出力は EXECUTABLE で表されるプログラムで処理されます。このプログラムは、有効な実行ファイルであればどれでも構いません。TEMPLATE をフォーマットするテンプレートに置き換えます。
例23.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 メッセージを修正するテンプレートのオプション使用を指定します。テンプレートに関する詳細は 「テンプレート」 を参照してください。
重要現在 rsyslog は、
MySQL
とPostgreSQL
データベースにのみ対応しています。MySQL
およびPostgreSQL
のデータベースライター機能を使用するには、rsyslog-mysql および rsyslog-pgsql パッケージをそれぞれインストールします。また、/etc/rsyslog.conf
設定ファイルに適切なモジュールを読み込んでください。module(load=”ommysql”) # Output module for MySQL support module(load=”ompgsql”) # Output module for PostgreSQL support
rsyslog モジュールの詳細は 「Rsyslog モジュールの使用」 を参照してください。
もしくは、
omlibdb
モジュールが提供する汎用のデータベースインターフェイスを使用することもできます (サポート対象: Firebird/Interbase、MS SQL、Sybase、SQLLite、Ingres、Oracle、mSQL)。
-
PLUGIN はデータベースの書き込みを処理する指定プラグインを呼び出します (例えば、
- syslog メッセージの破棄
選択したメッセージを破棄する場合は、
stop
を使用します。破棄するアクションは、ほとんどの場合、さらに処理をする前にメッセージをフィルターリングするために使用されます。繰り返されるメッセージを省略しなければログファイルがいっぱいになってしまう場合に、これは効果的です。破棄アクションの結果は、指定された設定ファイル内の場所によって異なります。最善の結果を得るためにも、これらのアクションは、アクションリストの上に配置します。一旦破棄したメッセージを、設定ファイルの後の行で回復することはできないことに注意してください。
たとえば、以下のルールを使用すると、
local5.*
フィルターに一致するメッセージをすべて破棄します。local5.* stop
以下の例では、cron syslog メッセージがすべて破棄されます。
cron.* stop
注記rsyslog 7 より前のバージョンでは、syslog メッセージを破棄する際に、
stop
の代わりにチルダ文字 (~
) が使用されていました。
複数アクションの指定
各セレクターで、複数のアクションを指定できます。1 つのセレクターに複数アクションを指定するには、各アクションを別々の行に書き込んでそれらの先頭にアンパサンド文字 (&) を付けます。
FILTER ACTION & ACTION & ACTION
指定されたセレクターが評価されるのは 1 回のみであるため、複数の動作を指定すると、希望する結果の全体的なパフォーマンスが向上します。
例23.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
では、テンプレート定義が常にルール定義の前にくるようにする必要があります。