Я перехожу с syslogd на syslog-ng на сервере SLES 9 (syslog-ng в стандартной версии 1.6.8). Сервер является хостом для некоторых удаленных регистраторов.
Как мне настроить syslog-ng, чтобы максимум совместимость с поведением syslogd, когда дело касается имени хоста, печатаемого в журналах? Есть несколько пользовательских сценариев для анализа журналов, и они, вероятно, зависят от имен хостов, чтобы оставаться неизменными. Некоторые из них были объявлены syslogd как полные доменные имена, и если они будут удалены сейчас, конфликт имен наверняка произойдет.
Кстати, я не использовал параметры syslogd -s или -l для удаления полных доменных имен.
Снимок моего текущего исследования опций syslog-ng (обновление: это неверно, см. мой ответ):
options {
check_hostname(yes); # invalid chars?
keep_hostname(yes); # yes - if there is a hostname embedded in the message, it will
# be kept without overwrite/append
# see https://lists.balabit.hu/pipermail/syslog-ng/2002-August/003669.html
# note: RFC3164 allows either short hostname or IP, no FQDN
use_dns(yes); # if there is no hostname embedded in the message, try DNS
use_fqdn(no); # do not try to expand everything to FQDN? strip all FQDNs? strip only DNS-resolved FQDNs?
# old syslogd behaviour (?): use embedded hostname, print fqdn (strip only local
# domain + strip "-s" domains + strip domains for "-l" hosts)
chain_hostnames(no); # if keep_hostname(no) or hostname not embedded, attach (rather than assign)
# hostname/IP of *sender*; same as long_hostnames(off)
sync(0); # sync immediately
};
Я обнаружил, что руководства по syslog-ng несколько неадекватны.
Самостоятельный ответ. Кажется, невозможно имитировать поведение syslogd. После множества экспериментов я предоставляю обновленный снимок моих исследований / предположений по параметрам syslog-ng:
options {
#####################################################################
### the flow of decisions for hostnames, syslog-ng 1.6.8:
use_dns(yes); # yes = first resolve the IP in $HOST_FROM (the message sender)
keep_hostname(no); # no = ignore $HOST embedded in the message (rare); overwrite $HOST with $HOST_FROM
# note: RFC3164 allows embedding short hostname or IP, not FQDN
use_fqdn(yes); # yes = expand everything to FQDN, including local name
# Note syslogd behaviour is incompatible: use FQDN, but strip local
# domain + strip "-s" domains + strip domains for "-l" hosts
chain_hostnames(no); # no = keep $FULLHOST same as $HOST;
# do not expand $FULLHOST into either "src@$HOST" for localhost,
# or to "$HOST/$HOST_FROM" for remote client
#long_hostnames(no); # synonym of chain_hostnames
### with default template, the resulting $FULLHOST is written to log
#####################################################################
check_hostname(yes); # invalid chars?
sync(0); # sync immediately
};
Я обнаружил, что сообщения от моих удаленных систем, вероятно, не имеют встроенного имени хоста, и это приводит к бесполезности keep_hostname.
Чтобы уменьшить влияние разрешения имен на производительность, вы также можете попробовать следующие приемы: http://www.balabit.com/dl/html/syslog-ng-v3.0-guide-admin-en.html/ch07s04.html
«Я обнаружил, что руководства по syslog-ng несколько неадекватны». > Комментарии и отзывы о руководствах и документах syslog-ng приветствуются по адресу documentation@balabit.com или в списке рассылки syslog-ng (https://lists.balabit.hu/mailman/listinfo/syslog-ng).
Пожалуйста, дайте мне знать, подходит ли вам вариант use_dns (yes), и я постараюсь сделать эту часть документации более понятной в следующем выпуске.
Возможно, у вас есть все, что вам нужно, за исключением use_dns(yes);
. Включение этого параметра приведет к тому, что syslog-ng будет выполнять поиск в DNS по IP-адресу, с которого поступает журнал. Это большой снижение производительности (поиск DNS по мере поступления журналов, который syslog-ng должен блокироваться, потому что он не может записывать журналы, пока поиск DNS не вернется), и это также означает, что если журнал не включает запись, syslog-ng попытается заполнить его именем хоста DNS, в то время как традиционный системный журнал заполнит его IP-адресом источника журнала.
Честно говоря, единственные строчки, которые вам абсолютно необходимы, это keep_hostname(yes);
и (просто чтобы не допустить недопустимые символы), check_hostname(yes);
. Остальные ничего не повредят, но и не требуются строго (за одним исключением use_dns(yes);
, как упоминалось выше, чего вы не хотите).