Использование syslog в приложении rails

Я думаю использовать syslog в моих приложениях rails. Этот процесс описан в этом сообщении в блоге:

  • Добавьте gem 'SyslogLogger' к вашему Gemfile
  • Добавьте require 'syslog_logger' в начало config/environments/production.rb
  • Также раскомментируйте строку config.logger = в том же файле.

В производственной коробке у меня есть 4 рельсовых приложения, работающих с пассажирами. Если я переключусь на использование syslogger для всех 4 моих приложений, то я боюсь, что сообщения журнала из всех 4 приложений перейдут в один файл, а сообщения журнала будут чередоваться. Конечно, я могу использовать splunk, но сначала я хотел проверить, удалось ли мне получить один файл журнала для каждого из моих приложений rails. Это было бы желательно для моей ситуации.

Возможно ли это?

Ответ 1

@cite отвечает на один вариант отличия приложений. Однако в кадре сообщений syslog фактически есть 2 поля, которые делают его еще проще: hostname и tag (более известный и используемый как имя программы).

hostname устанавливается демонами системного syslog, прежде чем он пересылает сообщение на централизованный сервер. Это будет одинаково для всех приложений в одной и той же системе, но может быть удобно, когда вы будете расти за 1 сервер.

Более интересным является tag. Ваше приложение определяет tag, когда оно создает экземпляр SyslogLogger. Например:

SyslogLogger.new('app1')

Класс logger отправит в систему syslogd как app1 и будет отображаться как в локальном файле журнала, так и в любом удаленном месте назначения syslog (без необходимости самим изменять сообщение журнала). По умолчанию используется rails. Все современные демоны syslog могут фильтроваться на основе tag; см. program() для syslog-ng и $programname для rsyslog.

Кроме того, стоит отметить, что SyslogLogger в основном обертывает функции C openlog() и syslog(), поэтому в основном все пост-лог-конфигурации происходят на системном демоне. Как правило, это желательно, но иногда вы можете захотеть, чтобы ваше приложение Rails регистрировалось непосредственно в определенном месте назначения (например, чтобы упростить автоматическое развертывание, изменить атрибуты, которые не разрешены syslog(), или работать в средах без доступа к системному демонам).

Мы столкнулись с несколькими этими случаями и сделали замену Logger, которая сама генерирует пакеты UDP. Драгоценность remote_syslog_logger на GitHub.

Ответ 2

Да, по умолчанию почти все Unix syslogds будут записывать сообщения, указанные в объекте user или local* в том же файле. Однако каждый syslogd, который я знаю, позволит вам указывать лог файлы на основе каждого объекта, поэтому вы можете иметь свой первый журнал приложений на local1.*, второй на local2.* и т.д.

Кроме того, новые демоны syslog, такие как syslog-ng, позволяют расщеплять сообщения на разные файлы, оценивая сообщение с регулярным выражением (записывать строки журнала, которые имеют railsapp_1 в них до /var/log/railsapp_1.log и т.д.).

Итак, сконфигурируйте свой syslogd соответствующим образом, и все будет готово (подробности о настройке этой конфигурации следует задать на serverfault.com, если ваши системные man-страницы не будут 't помочь вам сделать это.)