web-dev-qa-db-ja.com

$ {Host}と$ {Host_FROM}を比較するにはどうすればよいですか(または$ {Host}!= $ {Host}の理由)?

私は次のように要約できる設定を持っています:

_service --> syslog-ng relay --> syslog-ng server
_

_syslog-ng_サーバーでは、ログを次のように整理します。

_/var/log/ ----> syslog-ng server local log files...
           \--> ${FROM_Host}/ 
                 \---> Syslog-ng relay Host log files...
                 \---> ${Host}/
                        \---> Service log files...
_
  • デフォルトの場所/ var/logにある_syslog-ng_サーバーでローカルに生成されたログ。
  • リレー名が付けられたサブディレクトリ内のリレーで生成されたログ/ var/log/$ {FROM_Host}
  • 関連するリレーのサブディレクトリ内のサービスによって生成されたログ/ var/log/$ {FROM_Host}/$ {Host}

_syslog-ng_サーバーホストで次の構成を作成しました。

_@version: 3.7
@include "scl.conf"

options {
    dns-cache-hosts("/etc/hosts");
    keep-hostname(yes);
    use-dns(persist_only);
};

...(removed)...

# syslog-ng server local logs, works fine.
log {
    source(local_src);
    local_file();
};

# syslog-ng relays, never matches.
log {
    source(remote_src);
    filter { Host("${Host_FROM}", type(string)); };
    local_file(subdir("${Host_FROM}/"));
};

# Services, works fine but also matches syslog-ng relays.
log {
    source(remote_src);
    filter { not Host("${Host_FROM}", type(string)); };
    local_file(subdir("${Host_FROM}/$(sanitize $Host)/"));
};
_

詳細については、local_file()は、ログエントリを保存するサブディレクトリをパラメータとして使用するカスタムログブロックです。

Host() フィルターは、そのパラメーターを$ {Host}と比較するものとして説明されています。私の考えは、これを使用して$ {Host}(syslogメッセージの作成者)と$ {Host_FROM}(syslogメッセージのラストホップ)をチェックすることでした。

  • それらが等しい場合、メッセージは_syslog-ng_リレーによって生成されています。
  • それらが異なる場合、メッセージはサービスによって生成されています。

ただし、生成されたパスに$ {Host}$ {Host_FROM}の値の違いが示されていない場合でも、テストHost("${Host_FROM}", type(string))は常に失敗します。 (たとえば、リレーがtherelayという名前の場合、リレーログは/ var/log/therelay/therelay // var/logの展開/ $ {Host_FROM}/$(sanitize $ Host)/)。

パターンを生の文字列ではなく正規表現として解釈するために、サニタイズを削除しようとしました。正規表現でパターンの最初と最後に_.*_を追加し、Host("${Host_FROM}")を置き換えながらこれらすべてのテストを作り直しました。 match("${Host_FROM}", value(Host))によるものですが、何も機能していないようです。

実際、Host("${Host}")$ {Host}とそれ自体を比較)でさえ、決して一致しないようです。

ただし、フィルターをfilter { Host(".*"); };に置き換えると、このエントリは正しく強制的に一致します。

これは予想される動作ですか? $ {Host}$ {Host_FROM}の内容を比較するにはどうすればよいですか?

3
WhiteWinterWolf

これが最良の答えかどうかわからないので、今は質問を開いたままにしておきます。

マクロはフィルター関数で展開されていないようです。このような場合は "やや遅い" 特定の構文の使用が必要と思われるため、速度の最適化が原因と考えられます。

Host("${Host_FROM}")は、文字通り$ {Host_FROM}という名前のホストとのみ一致します。これは、通常の状況では発生しない可能性があります。

行うべき正しいテストは、以下に定義されているフィルターのようです。

filter { "${Host}" == "${Host_FROM}" };

この構文は効率が悪いかもしれませんが、これは2つのマクロの内容を比較する唯一の方法だと思います。

1
WhiteWinterWolf