Вопрос или проблема
Действительно озадачен тем, что произошло. У меня 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
, прежде чем попадут в вашу специальную папку.
Решение проблемы
Чтобы избежать дублирования сообщений и перенаправить их только в вашу специальную папку, вам нужно реализовать фильтрацию для сообщений перед их записью. Ниже представлен пример, как это можно сделать:
- Переместите ваши шаблоны и добавьте фильтрацию.
Ваш текущий конфиг содержит следующие строки:
$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-адреса, с которых вы хотите собирать логи.
- Организация конфигурации.
Для лучшей управляемости и конфигурации, рекомендуется выделить ваши новые настройки в отдельный файл в каталоге /etc/rsyslog.d/
, например, 00-custom-logging.conf
. Этот файл должен быть загружен первым метаконфигурацией rsyslog
, чтобы избежать конфликтов.
Процесс перезагрузки
После внесённых изменений не забудьте перезагрузить службу rsyslog для применения новой конфигурации:
service rsyslog restart
Или, если вы используете systemd
, выполните:
systemctl restart rsyslog
Заключение
Теперь ваши логи должны корректно записываться в указанную папку /data/rsyslog
без дублирования в стандартных файлах системы. Также учитывайте важность документирования всех изменений в конфигурационных файлах для упрощения диагностики в будущем. Если после выполнения вышеприведённых шагов проблемы все ещё возникают, проверьте права на директорию /data/rsyslog
, чтобы убедиться, что процесс rsyslog
имеет необходимые разрешения для записи в эту папку.