Назад | Перейти на главную страницу

Как сравнить $ {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...

Я создал следующую конфигурацию на 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} (автор сообщения системного журнала) и $ {HOST_FROM} (последний переход сообщения системного журнала):

Однако тест host("${HOST_FROM}", type(string)) всегда не работает, даже если сгенерированный путь не показывает никакой разницы между значениями $ {HOST} и $ {HOST_FROM} (например, для реле с именем возложить, журналы реле будут храниться ниже / var / log / relay / relay / (расширение / var / log / $ {HOST_FROM} / $ (очистить $ 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}" };

Хотя этот синтаксис может быть менее эффективным, я думаю, что это единственный способ сравнить содержимое двух макросов.