Rsyslog не распознает некоторые имена хостов

Вопрос или проблема

У меня есть сервер 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 не может корректно извлечь хостнейм из определенного формата строк лога или не настроен для обработки таких форматов.

Рекомендации по решению проблемы

  1. Используйте шаблоны для разбора логов: Вы можете создать пользовательские шаблоны и использовать регулярные выражения для извлечения хостнеймов из строк. Рассмотрите возможность создания шаблона, который обрабатывает различные форматы сообщения.

    Пример шаблона, который можно добавить в конфигурацию:

    template(name="CustomFormat" type="list") {
       property(name="hostname" format="name")
       property(name="msg" format="string")
    }
    
    *.* ?CustomFormat
  2. Настройка правил обработки: Проверьте, как настроены ваши правила в 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")
    }
  3. Разрешение имен: Как было предложено в комментариях, можно добавить IP-адреса и соответствующие хостнеймы в файл /etc/hosts на вашем сервере. Это позволит вашему Rsyslog-серверу правильно сопоставлять IP с именами хостов.

  4. Работа с локальным DNS: Если вы имеете дело с большим количеством устройств, настройка локального DNS-сервера может значительно упростить управление хостнеймами. Это позволит избежать ручного редактирования каждого IP-адреса и их соответствующих хостнеймов в файле /etc/hosts.

  5. Логи и диагностика: Включите расширенное логирование в Rsyslog, чтобы диагностировать, почему определенные сообщения трактуются именно так. Возможно, имеются особые символы или форматы, которые Rsyslog не распознает.

Заключение

Эти подходы помогут оптимизировать и настроить вашу систему Rsyslog для более эффективной работы с логами от различных сетевых устройств. Не забудьте протестировать изменения на тестовом окружении, чтобы убедиться, что все работает так, как задумано, прежде чем применять их на продуктивной системе. Удачи в решении данной проблемы!

Оцените материал
Добавить комментарий

Капча загружается...