Вопрос или проблема
У меня есть сервер rsyslog, работающий на CentOS (CentOS Linux release 7.4.1708 (Core)). Мы в основном используем его для сетевых устройств, преимущественно Cisco. Я отправляю имя хоста со всеми своими событиями журналирования. Мой сервер создает каталог для каждого хоста, основываясь на его имени хоста. Однако многие имена хостов не распознаются, и каталог создается с использованием IP-адреса устройства. Я пытаюсь выяснить, могу ли я настроить свои параметры для распознавания этих отсутствующих имен хостов.
Вот пример корректно функционирующего устройства:
Этот Cisco ASA отправляет имя хоста непосредственно после временной метки:
Sep 12 10:04:13 FIREWALL01 : %ASA-6-302016: Teardown UDP connection ...
Эти журналы ASA помещаются в каталог с названием “FIREWALL01”. Это поведение, которого я хочу.
Некорректное Поведение:
Это устройство – маршрутизатор Cisco ISR. Он по-прежнему включает имя хоста, но оно появляется позже в журнале событий:
Sep 12 09:33:07 10.X.X.X 38174: ISRROUTER01: Sep 12 14:33:06.233: %BGP-5-ADJCHANGE: neighbor ...
В этом примере я ожидал бы, что rsyslog поместит эти события в каталог с названием “ISRROUTER01”, однако вместо этого они помещаются в каталог с названием “10.X.X.X”.
Текущая Конфигурация:
Вот мой текущий конфигурационный файл /etc/rsyslog.conf:
# Где размещать вспомогательные файлы
$WorkDirectory /var/lib/rsyslog
# Использовать стандартный формат временной метки
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Возможность синхронизации файлов по умолчанию отключена. Эта функция обычно не требуется,
# не полезна и значительно снижает производительность
#$ActionFileEnableSync on
# Отключение приема сообщений через локальный лог-сокет;
# локальные сообщения теперь получаются через imjournal.
$OmitLocalLogging on
# Файл для хранения позиции в журнале
$IMJournalStateFile imjournal.state
#### Шаблоны ####
# журналировать каждый хост в своем каталоге
$template RemoteHost,"/var/log/syslog/%HOSTNAME%/%HOSTNAME%.log"
# Локальное Журналирование
$RuleSet local
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
# использовать локальный набор правил по умолчанию, если не указано иное
$DefaultRuleset local
# Удаленное Журналирование
$RuleSet remote
*.* ?RemoteHost
#### Слушатели ####
# связывать наборы правил со слушателями
$InputTCPServerBindRuleset remote
$InputUDPServerBindRuleset remote
# активировать слушатели
$InputTCPServerRun 514
$UDPServerRun 514
Итак, у кого-нибудь есть идеи по изменениям конфигурации, которые я мог бы внести, чтобы извлекать имя хоста из нескольких различных типов файлов журналов? Может быть, какой-то шаблон?
Заранее спасибо!
У меня была похожая проблема с моим сервером rsyslog. Я собираю syslog сообщения с множества устройств, таких как Linux, Cisco и MikroTik и так далее. Похоже, что имена хостов сетевых устройств не разрешаются правильно, и они отображаются с их IP-адресами или другими именами, например, _gateway.
Что я придумал, так это добавить все отслеживаемые хосты в /etc/hosts на сервере rsyslog, и проблема была решена. Лично я запускаю локальный DNS-сервер, который фактически достигает того же результата.
Ответ или решение
Не распознавание некоторых хостнеймов в Rsyslog: решения и рекомендации
Проблема, с которой вы столкнулись, достаточно распространена при использовании Rsyslog для обработки логов различных сетевых устройств, таких как маршрутизаторы и коммутаторы Cisco. Ваша Rsyslog-система на CentOS 7.4.1708 работает корректно для некоторых устройств, но не распознает хостнеймы для других, что вызывает создание директорий по IP-адресам вместо ожидаемых названий хостов.
Анализ проблемы
Согласно вашему описанию, логика работы системы следующая: при поступлении логов от Cisco ASA, система правильно распознает хостнеймы, поскольку они передаются в начале строки. Однако, во многих других случаях, например, с Cisco ISR, хостнейм идет после IP-адреса и, следовательно, не распознается Rsyslog, что приводит к созданию директорий по IP-адресу.
Это может быть связано с тем, что Rsyslog не может корректно извлечь хостнейм из определенного формата строк лога или не настроен для обработки таких форматов.
Рекомендации по решению проблемы
-
Используйте шаблоны для разбора логов: Вы можете создать пользовательские шаблоны и использовать регулярные выражения для извлечения хостнеймов из строк. Рассмотрите возможность создания шаблона, который обрабатывает различные форматы сообщения.
Пример шаблона, который можно добавить в конфигурацию:
template(name="CustomFormat" type="list") { property(name="hostname" format="name") property(name="msg" format="string") } *.* ?CustomFormat
-
Настройка правил обработки: Проверьте, как настроены ваши правила в Rsyslog. Вы можете использовать блоки if-then для управления, какое действие предпринять на основе наличия определенных паттернов в логах.
Пример:
if ($msg contains "10.X.X.X") then { # Logs with IP Address set $!hostname = "ISRROUTER01"; # Здесь можно добавить логику для извлечения имени хоста action(type="omfile" file="/var/log/syslog/$!hostname/$!hostname.log") }
-
Разрешение имен: Как было предложено в комментариях, можно добавить IP-адреса и соответствующие хостнеймы в файл
/etc/hosts
на вашем сервере. Это позволит вашему Rsyslog-серверу правильно сопоставлять IP с именами хостов. -
Работа с локальным DNS: Если вы имеете дело с большим количеством устройств, настройка локального DNS-сервера может значительно упростить управление хостнеймами. Это позволит избежать ручного редактирования каждого IP-адреса и их соответствующих хостнеймов в файле
/etc/hosts
. -
Логи и диагностика: Включите расширенное логирование в Rsyslog, чтобы диагностировать, почему определенные сообщения трактуются именно так. Возможно, имеются особые символы или форматы, которые Rsyslog не распознает.
Заключение
Эти подходы помогут оптимизировать и настроить вашу систему Rsyslog для более эффективной работы с логами от различных сетевых устройств. Не забудьте протестировать изменения на тестовом окружении, чтобы убедиться, что все работает так, как задумано, прежде чем применять их на продуктивной системе. Удачи в решении данной проблемы!