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

Перенаправление rsyslog в syslog-ng с полным доменным именем и разделением объектов

Я пытаюсь настроить клиентов rsyslog для пересылки сообщений в мои системы репозиториев syslog-ng. Пересылка сообщений работает «из коробки», но мои клиенты регистрируют короткие имена, а не полные доменные имена. В результате сообщения в репозитории системного журнала также используют короткие имена, что является проблемой, поскольку невозможно легко определить, из какой системы было отправлено сообщение. Мои клиенты получают свои имена через DHCP / DNS.

Я пробовал несколько решений, пытаясь заставить это работать, но безуспешно. Я использую rsyslog 4.6.2 и syslog-ng 3.2.5.

Я пробовал установить $PreserveFQDN on в качестве первой директивы в /etc/rsyslog.conf (и, конечно же, перезапуск rsyslog). Похоже, никакого эффекта нет.

hostname --fqdn на клиенте возвращает правильное полное доменное имя, поэтому проблема не в том, может ли система определить собственное полное доменное имя.

$LocalHostName <fqdn> выглядело многообещающе, но эта директива недоступна в моей версии rsyslog (доступна с 4.7.4+, 5.7.3+, 6.1.3+). Обновление на данный момент невозможно.

Настройка сервера syslog-ng для заполнения имен на основе обратного поиска через DNS не является вариантом. Есть сложности с обратным DNS и публичным облаком.

Указание для сервера пересылки использования настраиваемого шаблона на первый взгляд кажется приемлемым вариантом. Я могу указать следующее, что заставляет локальное ведение журнала начать использовать полное доменное имя в репозитории syslog-ng.

$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate

Однако, когда я устанавливаю это на место, похоже, что syslog-ng не может классифицировать сообщения по возможностям или приоритету. Сообщения поступают как FQDN, но все записывается в user.log. Когда я не использую настраиваемый шаблон, сообщения должным образом распределяются по объектам и приоритетам, но с коротким именем.

Итак, в итоге, если я вручную обману rsyslog, включив в него полное доменное имя, сведения о приоритете и средствах будут потеряны для syslog-ng. Как я могу заставить rsyslog вести журнал FQDN, который работает правильно при переходе в репозиторий syslog-ng?

Конфигурация клиента rsyslog:

$ModLoad imuxsock.so    # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so      # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
$WorkDirectory /var/spool/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList   # run asynchronously
$ActionResumeRetryCount -1    # infinite retries if host is down
*.* @syslog-ng1.example.com
*.* @syslog-ng2.example.com

Конфигурация syslog-ng (сокращенная для краткости):

options {
    flush_lines (0);
    time_reopen (10);
    log_fifo_size (1000);
    long_hostnames (off);
    use_dns (no);
    use_fqdn (yes);
    create_dirs (no);
    keep_hostname (yes);
};
source src {
    unix-stream("/dev/log");
    internal();
    udp(ip(0.0.0.0) port(514));
};
destination per_host_destination {
file( "/var/log/syslog-ng/devices/$HOST/$FACILITY.log" owner("root") group("root")  perm(0644) dir_owner(root) dir_group(root) dir_perm(0775) create_dirs(yes));
};
log { source(src); destination(per_facility_destination); };

Хорошо, я нашел способ. Оказывается, для $ ActionForwardDefaultTemplate по умолчанию установлено значение:

$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat

За эта документация rsyslog, то RSYSLOG_ForwardFormat специально используется для поддержания взаимодействия между разными системными журналами. Неудивительно, что если вы измените этот шаблон Forward, как я описал изначально, некоторые функции других системных журналов сломаются:

$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate

Обходной путь, который я нашел, заключался в том, чтобы выкопать внутренний шаблон, который RSYSLOG_ForwardFormat использует и имитирует его. Покопавшись в источнике, я в конце концов обнаружил, что RSYSLOG_ForwardFormat на самом деле это:

"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"

Итак, если я создам настраиваемый шаблон с почти таким же содержимым, но заменяю свое полное доменное имя вместо %HOSTNAME% макрос, разделение средств syslog-ng работает правильно, и системные журналы с полным доменным именем:

$template MyForwardTemplate, "<%PRI%>%TIMESTAMP% <fqdn> %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
$ActionForwardDefaultTemplate MyForwardTemplate