rsyslog7 は、正規表現と一致しない場合にホスト名をフィルタリングします。

rsyslog7 は、正規表現と一致しない場合にホスト名をフィルタリングします。

だから私はrsyslogに最初にアクセスし(最近のsyslog-ngから切り替えた)、動的ファイル名を持つことができることが本当に好きです...最近の作業はdockerを使い始め、syslogtagの多くのフィールドをリモートホストに送信します。 。したがって、各インスタンスに対してフィルタを設定するのではなく、関連する詳細を解析してそれを独自のログ/ディレクトリに保存する動的フィルタを作成してみました(例:/var/log/docker/app name/syslog .log)。

私の「アプリケーション名」は、フィールド間に正しい区切り文字を提供するときに機能しますが、正規表現は** NO MATCH**を返し、すべてを入れます。 Enter '/var/' log /docker/**does not match* */syslog.log'。 **NO MATCH**ディレクトリを使用することは問題ではありませんが、各リモートホストをファイルにグループ化することは問題ではありません。正規表現が不一致を返すかどうかをテストし、ファイル名を 'syslog.log'から '%hostname%.log'に変更する方法はありますか?

答え1

私は専門家ではありませんが、ここから始めることができます。正規表現を繰り返す必要があります(文字列を取得するためにテンプレートを評価する方法がわかりません**NO MATCH**)。たとえば、「appname」部分がregexpと一致すると仮定すると、次のように[a-z]+:書くことができます。

$template nomatch,"/var/log/docker/nomatch/%hostname%.log"
if (not re_match($msg, "[a-z]+:")) then {
   action(type="omfile" dynaFile="nomatch")
   stop
}

$template目的のファイル名を記述し、一致ifするものを見つけて、actionこのメッセージを処理せずにファイルに書き込む操作を実行します。これはaction()意味するここRainerScriptで。

関連情報