У меня есть установка, которую можно резюмировать следующим образом:
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
сервер, расположенный по умолчанию, / var / журнал.Я создал следующую конфигурацию на 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} (последний переход сообщения системного журнала):
syslog-ng
реле.Однако тест 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}" };
Хотя этот синтаксис может быть менее эффективным, я думаю, что это единственный способ сравнить содержимое двух макросов.