私は次のように要約できる設定を持っています:
_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...
_
syslog-ng
_サーバーでローカルに生成されたログ。_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}の内容を比較するにはどうすればよいですか?
これが最良の答えかどうかわからないので、今は質問を開いたままにしておきます。
マクロはフィルター関数で展開されていないようです。このような場合は "やや遅い" 特定の構文の使用が必要と思われるため、速度の最適化が原因と考えられます。
Host("${Host_FROM}")
は、文字通り$ {Host_FROM}という名前のホストとのみ一致します。これは、通常の状況では発生しない可能性があります。
行うべき正しいテストは、以下に定義されているフィルターのようです。
filter { "${Host}" == "${Host_FROM}" };
この構文は効率が悪いかもしれませんが、これは2つのマクロの内容を比較する唯一の方法だと思います。