Шаблон rsyslogd перестал работать

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

Действительно озадачен тем, что произошло. У меня rsyslogd работал на сервере Centos 6.5 в течение некоторого времени, регистрируя удаленные хосты в специальной папке /data/rsyslog. Вчера я настроил наш файрвол на ведение журнала, и все работало отлично, кроме того, что журналы для этого файрвола были большими, поэтому я решил настроить задачу logrotate для ротации. Сегодня утром все журналы были обработаны, но больше не велась запись в файлы в моей папке rsyslog для любых хостов. Сначала я думал, что что-то не так с созданием нового файла, но что я обнаружил, так это то, что все удаленные журналы теперь поступают в стандартный файл /var/log/message. Вот мой файл rsyslog.conf:

[root@backup1 etc]# cat rsyslog.conf
# конфигурационный файл rsyslog v5

# Для получения дополнительной информации смотрите /usr/share/doc/rsyslog-*/rsyslog_conf.html
# Если у вас возникли проблемы, смотрите http://www.rsyslog.com/doc/troubleshoot.html

#### МОДУЛИ ####

$ModLoad imuxsock # поддержка локальной системной записи (например, через команду logger)
$ModLoad imklog   # поддержка журналирования ядра (ранее выполнялось rklogd)
#$ModLoad immark  # обеспечивает --MARK-- возможность сообщения

# Обеспечивает прием syslog по UDP
$ModLoad imudp
$UDPServerRun 514

# Обеспечивает прием syslog по TCP
$ModLoad imtcp
$InputTCPServerRun 514

#### ГЛОБАЛЬНЫЕ ДИРЕКТИВЫ ####

# Использовать формат временной метки по умолчанию
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Возможность синхронизации файлов по умолчанию отключена. Эта функция обычно не требуется,
# не полезна и сильно снижает производительность
#$ActionFileEnableSync on

# Включить все конфигурационные файлы в /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

#### ПРАВИЛА ####

# Записывать все сообщения ядра на консоль.
# Регистрация всего остального засоряет экран.
#kern.*                                                 /dev/console

# Записывать все, кроме почты, уровня info или выше.
# Не регистрировать приватные сообщения аутентификации!
*.info;mail.none;authpriv.none;cron.none        /var/log/messages

# Файл authpriv имеет ограниченный доступ.
authpriv.*      /var/log/secure

# Записывать все почтовые сообщения в одном месте.
mail.*                                                  -/var/log/maillog

# Записать информацию cron
cron.*                                                  /var/log/cron

# Все получают экстренные сообщения
*.emerg                                                 :omusrmsg:*

# Сохранить ошибки новостей уровня crit и выше в специальный файл.
uucp,news.crit  /var/log/spooler

# Сохранить сообщения загрузки также в boot.log
local7.*                                                /var/log/boot.log

$template Secure_log,"/data/rsyslog/%fromhost%.secure"
$template Message_log,"/data/rsyslog/%fromhost%.message"

Таким образом, файл был в этом состоянии, но я обнаружил, что у меня нет действия, поэтому я добавил следующую строку в конец для тестирования:

*.* ?Message_log

Теперь все идет в файлы с именем хоста, как и ожидалось, в эту папку, но также идет в папку /var/log. Я полагаю, что строка выше и делает это с /var/log/messages. Я обновился до версии rsyslogd 7 в процессе попытки заставить это работать. Не уверен, что произошло, но просто пытаюсь заставить это работать с нуля сейчас и не могу найти правильную конфигурацию для регистрации удаленных хостов только в этой специальной папке. Может кто-то помочь?

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

Когда вы используете *.* ?Message_log в конце файла, сообщение пройдет перед *.info;mail.none;authpriv.none;cron.none /var/log/messages, как вы и ожидали.

Перед $IncludeConfig /etc/rsyslog.d/*.conf вам нужно объявить свой шаблон и использовать выражение if для фильтрации вашего сообщения. Попробуйте сделать следующее:

$template Secure_log,"/data/rsyslog/%fromhost%.secure"
$template Message_log,"/data/rsyslog/%fromhost%.message"
if ($fromhost-ip == "IP ОТПРАВИТЕЛЯ СООБЩЕНИЙ") then {
  *.* ?Message_log
  stop
}

Это зарегистрирует необходимые сообщения в указанном вами файле и отклонит их с помощью stop, чтобы они не записывались в другое место.

Альтернатива этому – создание файла в /etc/rsyslog.d/, например 00-example.conf, чтобы сделать ваши конфигурации более организованными. Но убедитесь, что номер файла должен быть ниже числа по умолчанию (это 50).

Ответ или решение

Решение проблемы с работой шаблона rsyslogd на Centos 6.5

Недавно вы столкнулись с проблемой, когда ваши журналы перестали записываться в указанную папку /data/rsyslog для удаленных хостов и перенаправлялись в стандартный файл /var/log/messages. Давайте рассмотрим, что произошло и как можно исправить данную ситуацию.

Проблема и ее причина

Из вашего описания видно, что после настройки задачи по ротации журналов для вашего брандмауэра, записи перестали попадать в ваши определенные шаблоны. Это может быть связано с порядком обработки правил в конфигурационном файле rsyslog. Правила обрабатываются последовательно, и если универсальное правило *.info;mail.none;authpriv.none;cron.none /var/log/messages стоит до вашего нового правила *.* ?Message_log, то все сообщения сначала будут записываться в /var/log/messages, прежде чем попадут в вашу специальную папку.

Решение проблемы

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

  1. Переместите ваши шаблоны и добавьте фильтрацию.

Ваш текущий конфиг содержит следующие строки:

$template Secure_log,"/data/rsyslog/%fromhost%.secure"
$template Message_log,"/data/rsyslog/%fromhost%.message"

Теперь добавим условие, которое будет проверять, от какого адреса IP поступают сообщения, и отправлять их в нужный файл, а также предотвращать дальнейшую обработку:

$template Secure_log,"/data/rsyslog/%fromhost%.secure"
$template Message_log,"/data/rsyslog/%fromhost%.message"

if ($fromhost-ip == "IP_ВАШЕГО_ИДЕАЛЬНОГО_ХОСТА") then {
  *.* ?Message_log
  stop
}

Заметьте, что необходимо заменить "IP_ВАШЕГО_ИДЕАЛЬНОГО_ХОСТА" на реальные IP-адреса, с которых вы хотите собирать логи.

  1. Организация конфигурации.

Для лучшей управляемости и конфигурации, рекомендуется выделить ваши новые настройки в отдельный файл в каталоге /etc/rsyslog.d/, например, 00-custom-logging.conf. Этот файл должен быть загружен первым метаконфигурацией rsyslog, чтобы избежать конфликтов.

Процесс перезагрузки

После внесённых изменений не забудьте перезагрузить службу rsyslog для применения новой конфигурации:

service rsyslog restart

Или, если вы используете systemd, выполните:

systemctl restart rsyslog

Заключение

Теперь ваши логи должны корректно записываться в указанную папку /data/rsyslog без дублирования в стандартных файлах системы. Также учитывайте важность документирования всех изменений в конфигурационных файлах для упрощения диагностики в будущем. Если после выполнения вышеприведённых шагов проблемы все ещё возникают, проверьте права на директорию /data/rsyslog, чтобы убедиться, что процесс rsyslog имеет необходимые разрешения для записи в эту папку.

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

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