Tcl では、後の時点で処理するためにコマンドをキューに入れることができます。それを行うには after Tcl コマンドを使用します。このコマンドの最も一般的な使用方法は、一定の時間間隔(「相関期間」と呼ばれる)にわたって、複数のイベントを相互に関連付ける(収集して要約する)ことです。該当する期間が満了すると、フィルタは「ウェイクアップ」し、その期間に発生したイベントを計算または要約する必要があります。また、多くの場合、イベント報告用の新しい
syslog メッセージを送信する必要があります。このバックグラウンド プロセスは、特定の時間の経過後、Tcl インタープリタがキューに入れられたコマンドを実行できるようにする ESM イベント ループ プロセスによって処理されます。
syslog フィルタモジュールが相関期間を利用する必要がある場合、相関期間が満了した時点で after Tcl コマンドを使用して要約手順を呼び出す必要があります(「Embedded Syslog Manager の設定例」セクションにある例を参照)。バックグラウンドプロセスの実行中は通常のフィルタチェーンの処理が行われないため、出力を生成するために、これらのフィルタで
2 つの ESM Tcl 拡張機能(errmsg または esm_errmsg )のいずれかを使用する必要があります。
バックグラウンド処理中に、after コマンドによってキューに入れられたコマンドは、(通常の処理のように)フィルタチェーンのコンテキストでは実行されず、Tcl インタープリタによって連続して実行される自律的な手順となります。したがって、これらのバックグラウンド手順では通常の Tcl
グローバル名前空間変数を扱うべきではありません(ただし esm_errmsg の使用時に次のフィルタ用にグローバル名前空間変数を設定する場合を除く)。代わりに、独自の名前空間に保存される変数を扱う必要があります。これらの変数が手順の定義の外側で宣言される場合、すべてのコールで永続的です。
errmsg Tcl コマンドの目的は、新しいメッセージを作成して配信用に送り出し、その際に他の syslog フィルタモジュールをすべて回避することです。errmsg コマンドの構文は次のとおりです。
errmsg <severity> <stream> <message_string>
esm_errmsg Tcl コマンドの目的は、新しいメッセージを作成し、フィルタチェーン内のそれ以降にある syslog フィルタモジュールでメッセージを処理して、配信用に送り出すことです。esm_errmsg コマンドの構文は次のとおりです。
esm_errmsg <module_position>
errmsg() Tcl 関数と esm_errmsg() Tcl 関数の主な相違点として、errmsg はフィルタを無視してメッセージを配信用にキューに直接入れます。一方、esm_errmsg はフィルタチェーンの後続部分に syslog メッセージを送ります。
次の例では、新しい syslog メッセージが作成され、アラートシビラティ(重大度) 1 のタグを付けられて、設定された ESM ロギング ターゲット(ストリーム 2)に送信されます。このフィルタの目的は、30 分の相関期間中に個々の SYS-5-CONFIG
メッセージを抑制し、ウィンドウ終了時に要約メッセージを送信することです。
errmsg 1 2 “*Jan 24 09:34:02.539: %SYS-1-CONFIG_I: There have been 12
configuration changes to the router between Jan 24 09:04:02.539 and Jan 24
09:34:01.324”
(それ以降にある残りのフィルタを呼び出す)esm_errmsg を使用するために、このバックグラウンドプロセスは esm_errmsg を呼び出す前に、必要な Tool Command Language(Tcl)グローバル名前空間変数を設定する必要があります。::module_position を渡すと、開始するフィルタが ESM フレームワークに通知されます。したがって、esm_errmsg コマンドを使用するフィルタは、バックグラウンド処理用に、(通常の処理中にグローバル名前空間変数で渡される)::module_position を独自の名前空間変数に保存する必要があります。次に例を示します。
proc ::my_filter_namespace::my_summary_procedure{}
{
set ::orig_msg “*Jan 24 09:34:02.539: %SYS-1-CONFIG_I: There have been 12
configuration changes to the router between Jan 24 09:04:02.539 and Jan 24
09:34:01.324”
set ::timestamp “*Jan 24 09:34:02.539”
set ::severity 1
set ::stream 2
set ::traceback “”
set ::pid “”
set ::process “”
set ::format_string “There have been %d configuration changes to the router
between %s and %s”
set ::msg_args {12 “Jan 24 09:04:01.539” “Jan 24 09:34:01.324”}
esm_errmsg $::my_filter_namespace::my_module_position
}
esm_errmsg コマンド用にすべてのグローバル名前空間変数を設定することの利点は、フィルタがモジュール式であり、ESM フレームワークでのフィルタの使用順序が重要でないことです。たとえば、ESM を宛先とするすべてのメッセージの後ろにメッセージ発信者のホスト名を付ける必要がある場合、次のように
1 行の「hostname」フィルタを作成し、フィルタ チェーンの最後に配置できます。
return “$::orig_msg -- $::hostname”
この例では、バックグラウンド処理中にいずれかのフィルタが新しいメッセージを生成し、errmsg ではなく esm_errmsg を使用する場合、これらのメッセージの後ろに明確にホスト名が付けられます。