Вопрос или проблема
У меня есть некоторые журналы внутри директории под названием log
ls -l /var/log/
org1_app.log org2_app.log org1_perf.log org2_perf.log ...
Теперь я настроил rsyslog client
на хосте сервера. Вот конфигурация ниже
# файл конфигурации rsyslog
# Дополнительную информацию можно найти в /usr/share/doc/rsyslog-*/rsyslog_conf.html
# Если вы столкнулись с проблемами, см. http://www.rsyslog.com/doc/troubleshoot.html
#### МОДУЛИ ####
# Модуль imjournal ниже используется в качестве источника сообщений вместо imuxsock.
$ModLoad imuxsock # обеспечивает поддержку локальной системной регистрации (например, через команду logger)
$ModLoad imjournal # обеспечивает доступ к журналу systemd
#$ModLoad imklog # читает сообщения ядра (те же, что читаются из journald)
#$ModLoad immark # предоставляет возможность сообщений --MARK--
# Обеспечивает прием syslog по UDP
#$ModLoad imudp
#$UDPServerRun 514
# Обеспечивает прием syslog по TCP
$ModLoad imtcp
$InputTCPServerRun 514
#### ГЛОБАЛЬНЫЕ ДИРЕКТИВЫ ####
# Где хранить вспомогательные файлы
$WorkDirectory /var/lib/rsyslog
# Использовать формат временной метки по умолчанию
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Возможность синхронизации файлов отключена по умолчанию. Эта функция обычно не требуется,
# не полезна и оказывает значительное влияние на производительность
#$ActionFileEnableSync on
# Включить все файлы конфигурации в /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
# Отключить прием сообщений через локальный лог сокет;
# локальные сообщения теперь извлекаются через imjournal.
$OmitLocalLogging on
# Файл для хранения позиции в журнале
$IMJournalStateFile imjournal.state
#### ПРАВИЛА ####
# Записывать все сообщения ядра в консоль.
# Запись чего-либо еще загромождает экран.
#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
# ### начало правила пересылки ###
# Утверждение между началом ... концом определяет ОДНО правило пересылки
# Они принадлежат друг другу, НЕ разделяйте их. Если вы создаете несколько
# правил пересылки, продублируйте весь блок!
# Удаленная регистрация (мы используем TCP для надежной доставки)
#
# На диске создается очередь для этого действия. Если удаленный хост
# недоступен, сообщения сохраняются на диск и отправляются, когда он снова доступен.
#$ActionQueueFileName fwdRule1 # уникальный префикс имени для файлов очереди
#$ActionQueueMaxDiskSpace 1g # лимит пространства в 1Gb (использовать максимально возможное)
#$ActionQueueSaveOnShutdown on # сохранять сообщения на диск при завершении работы
#$ActionQueueType LinkedList # выполнять асинхронно
#$ActionResumeRetryCount -1 # бесконечные попытки, если хост недоступен
# удаленный хост: имя/айпи:порт, например, 192.168.0.1:514, порт опционально
#*.* @@remote-host:514
# ### конец правила пересылки ###
#*.info;mail.none;authpriv.none;cron.none @@xx.xx.xx.xx:514
$ModLoad imfile
$InputFileName /var/log/org*.log
$InputFileTag dev-log
$InputFileStateFile stat-dev-log
$InputFileSeverity error
$InputFileFacility local3
$InputFilePollInterval 10
$InputRunFileMonitor
local3.* @@xx.xx.xx.xx:514
После перезапуска rsyslog, журналы отправляются и принимаются на удаленном сервере внутри /var/log/messages
Но проблема в том, что все эти журналы смешиваются. Я хочу, чтобы каждый из этих файлов журнала создавался отдельно на удаленном сервере, и в них добавлялись бы последующие журналы.
Я искал некоторую информацию, но не смог найти ответ, удовлетворяющий моему запросу. Самый близкий результат, который я нашел, это этот ответ https://stackoverflow.com/questions/59861378/issue-with-multiple-logs-files-forwarding-with-rsyslog, но он включает в себя ручное определение каждого файла журнала, но в моем случае будет много файлов журналов, и я не могу вручную определить каждый из них в файле rsyslog.conf
.
Как мне убедиться, что данные из нескольких файлов журналов не смешиваются внутри /var/log/messages
, а вместо этого для каждого из них создается отдельный файл, и последующие обновления записываются в эти соответствующие файлы?
(Тривиальный ответ, но я еще не могу комментировать) Вы можете попробовать больше тегов https://www.gilesorr.ca/blog/rsyslog-intermediate-local.html или см. условия фильтрации: https://www.rsyslog.com/doc/master/configuration/filters.html
.
Ответ или решение
Вопрос о том, как настроить rsyslog
для отправки нескольких файлов логов на удаленный сервер и их сохранения в виде отдельных файлов, связан с более глубоким пониманием конфигурации этой системы логирования. Данный сценарий часто возникает в ситуациях, когда необходимо сохранить структуру и изоляцию логов для различных приложений или процессов, что помогает в их анализе и мониторинге.
Теория
-
Модули
rsyslog
: Rsyslog поддерживает несколько модулей, которые позволяют читать и пересылать логи. Два ключевых модуля для вашей задачи — этоimfile
для чтения логов из файлов иomfwd
для пересылки данных на удаленный сервер. -
Метки (Tags): Использование уникальных меток
InputFileTag
, позволяет добавить к сообщениям идентификатор, на основе которого удаленный сервер сможет различать и обрабатывать их индивидуально. -
Конфигурация на удаленном сервере: Удаленный сервер должен быть настроен так, чтобы правильно обрабатывать входящие лог-сообщения и сохранять их в разных файлах на основе этих меток.
-
Использование шаблонов (Templates): Система
rsyslog
позволяет использовать шаблоны для контроля формата и расположения логов. Это важный инструмент для достижения необходимой вам конфигурации.
Пример
Давайте посмотрим, как можно настроить rsyslog
на локальном и удаленном сервере, чтобы удовлетворить вашим требованиям:
Конфигурация на клиенте (Локальном сервере):
-
Модуль
imfile
: В действующей конфигурации вы уже подключили этот модуль. -
Настройка ввода файлов: Для каждого файла логов используйте уникальную метку:
$ModLoad imfile
$InputFileName /var/log/org1_app.log
$InputFileTag org1_app:
$InputFileStateFile stat-org1-app
$InputFileSeverity info
$InputFileFacility local1
$InputRunFileMonitor
$InputFileName /var/log/org2_app.log
$InputFileTag org2_app:
$InputFileStateFile stat-org2-app
$InputFileSeverity info
$InputFileFacility local2
$InputRunFileMonitor
# (и так далее для каждого файла)
- Пересылка логов: Используйте уникальные facility или тэги, чтобы различать типы данных на сервере:
local1.* @@remote-server:514
local2.* @@remote-server:514
Конфигурация на удаленном сервере:
- Создание шаблонов: В конфигурации удаленного сервера создайте шаблоны, которые используют теги для сохранения логов в отдельные файлы.
$template DynFile,"/var/log/%$input_file_file_tag%-%HOSTNAME%.log"
if $syslogtag == 'org1_app:' then ?DynFile
if $syslogtag == 'org2_app:' then ?DynFile
# (для каждого тега)
- Обработка входящих сообщений: Убедитесь, что в конфигурации удаленного сервера активированы правила для обработки входящих сообщений:
$ModLoad imtcp
$InputTCPServerRun 514
Применение
Указанная реализация позволит вам распределять журналы по отдельным файлам на удаленном сервере, минимизируя риск смешения данных из различных источников. Это особенно полезно в средах, где совместная работа множества приложений требует четкого разграничения логов для упрощения их анализа.
Настройка может потребовать дополнительных изменений, таких как оптимизация уровней срабатывания (severity) или подробная настройка фильтров. Rsyslog предоставляет гибкие возможности для глубокой конфигурации, обеспечивая эффективное управление логами. Обязательно протестируйте конфигурацию на тестовой среде перед внедрением в продуктивной, чтобы избежать унифицированных проблем.