journaldログドライバーを使用してDockerを実行しています。rsyslog(v8.29.0)を使用してこれらのメッセージを収集し、コンテナーに関する情報が注釈されたファイルに書き込みます。私が遭遇した問題は、$!
最初にローカルの$.
名前空間などに移動しない限り、テンプレートの名前空間でメッセージプロパティを使用できないことです。
私はこの構成で始めました:
module(load="imjournal" StateFile="imjournal.state")
template(name="ContainerTemplate" type="list") {
property(name="timereported" dateFormat="rfc3339" caseConversion="lower")
constant(value=" ")
property(name="$!CONTAINER_NAME")
constant(value=" ")
property(name="$!CONTAINER_ID")
constant(value=" ")
property(name="msg")
constant(value="\n")
}
if (strlen($!CONTAINER_NAME) > 0) then {
action(type="omfile"
file="/var/log/containers.log"
template="ContainerTemplate")
}
$!CONTAINER_NAME
および$!CONTAINER_ID
が定義されている場合でも、結果のテンプレートでは空の文字列に展開されます。既存のプロパティの値を使用して新しいプロパティを明示的に設定することで、このように回避できます。
template(name="ContainerTemplate" type="list") {
property(name="timereported" dateFormat="rfc3339" caseConversion="lower")
constant(value=" ")
property(name="$.container_name")
constant(value=" ")
property(name="$.container_id")
constant(value=" ")
property(name="msg")
constant(value="\n")
}
if (strlen($!CONTAINER_NAME) > 0) then {
set $.container_name = $!CONTAINER_NAME;
set $.container_id = $!CONTAINER_ID;
action(type="omfile"
file="/var/log/containers.log"
template="ContainerTemplate")
}
(私が使用している場合、つまり、私は、ローカル変数の大文字と小文字を変更する場合、これは、正常に動作します...しかし、$.CONTAINER_NAME
と$.CONTAINER_ID
代わりに小文字の同等の)、それは元の構成と同じように動作します(私はログに空の文字列を取得してもただし、プロパティを明示的に設定しています)。
ここで何が起こっているか知っていますか?よるとドキュメント、property
声明は「すべてのプロパティにアクセスすることができます」ので、私は混乱しています。