rsyslog が動的ログファイルを書き込まない

rsyslog が動的ログファイルを書き込まない

私の Java アプリ (Ubuntu 18.04 上) の systemd ユニット ファイルは動作しているようです。stdout と stderr を syslog に送信するように設定し、ログ エントリは /var/log/syslog に表示されていました。

ただし、動的な名前を使用したいので、次の内容を含む /etc/rsyslog.d/10-myapp.conf を追加しました。

$CreateDirs on

:programname, startswith, "myapp-" {
  /var/log/apps/$programname.log
  stop
}

その後、rsyslog を再起動すると、ディレクトリに $programname.log という名前のファイルが作成されました。

動的ファイル名の指定方法に問題があるのではないかと思います。他の場所では、選択するための異なる構文変数名の前後に %...% が付いたメッセージ。ただし、以下を試しても (rsyslog を再起動しても) 効果はありませんでした。

:programname, startswith, "myapp-" {
  "/var/log/apps/%programname%.log"
  stop
}

%programname%.logという名前のファイルが作成されました

答え1

動的なファイル名を使用するには、テンプレートを使用する必要があります。これは文字列に名前を付け(通常DynFileは例)、使用時に文字列内の値を挿入します%property%。従来の構文でテンプレートを使用するには、?.Tryをプレフィックスとして付ける必要があります。

$template DynFile,"/var/log/apps/%programname%.log"
:programname, startswith, "myapp-" {
  ?DynFile
  stop
}

非レガシー構文はより明確で、時にはより読みやすくなることがあります。実際には組み込みのオムファイルモジュール。注意してください、テンプレート2 つの異なる用途があります: 動的なファイル名として、および書き込むデータの形式として。ただし、単純な文字列の場合は、同じ方法で定義されます。例:

template(name="myfile" type="string"
     string="/var/log/apps/%programname%.log")

if ($programname startswith "myapp-") then {
     action(type="omfile" dynaFile="myfile")
     stop
}

のようなキーワードはdynaFile正確に入力する必要があります。 にはキーワード オプションaction()があることに注意してくださいtemplate=...。これは、ファイルに書き込まれるデータのテンプレートを提供するためのものです。

関連情報