Как лучше всего включить ротацию журналов в производственном приложении Ruby on Rails?
Это с помощью logrotate на хостинг-сервере или есть набор опций для инициализации регистратора из приложения?
Как лучше всего включить ротацию журналов в производственном приложении Ruby on Rails?
Это с помощью logrotate на хостинг-сервере или есть набор опций для инициализации регистратора из приложения?
Ответы:
Вы можете настроить рельсы, использовать инструменты системного журнала.
Пример в config / средах / production.rb .
# Use a different logger for distributed setups
config.logger = SyslogLogger.new
Таким образом, вы входите в системный журнал и можете использовать инструменты по умолчанию для поворота журналов.
Другой вариант - просто настроить logrotate для сбора логов, оставленных рельсами. В Ubuntu и Debian это будет, например, в файле с именем /etc/logrotate.d/rails_example_com
.
/path/to/rails.example.com/tmp/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
В соответствии с рекомендациями ниже, в Rails рекомендуется использовать copytruncate
, чтобы избежать перезапуска приложения Rails.
Редактировать: удалены «общие скрипты / конец скрипта», так как они здесь не используются и вызывают проблемы в соответствии с комментарием. И удалены create 640 root adm
согласно предложенному комментарию.
logrotate
решение, оно стоит ответа @ amit-saxena - предлагает использовать copytruncate
более чем create
директиву.
copytruncate
, не create
имеет никакого эффекта, так что вы, вероятно, должны удалить его из своего примера
su your_rails_user your_rails_group
с владельцем и группой файлов журналов (т. Е. Файлов процесса Rails / Passenger) или (последние версии?) Logrotate может пожаловаться на разрешения.
Если вы используете logrotate, вы можете выбрать любой из параметров, показанных ниже, поместив файл conf в каталог /etc/logrotate.d/.
# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
size=20M
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
Или
# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
Обратите внимание, что copytruncate создает резервную копию текущего журнала, а затем очищает файл журнала для продолжения записи. Альтернативой является использование команды create, которая выполнит ротацию, переименовав текущий файл, а затем создав новый файл журнала с тем же именем, что и у старого файла. Я настоятельно рекомендую вам использовать copytruncate, если вы не знаете, что вам нужно создать. Причина в том, что Rails все еще может указывать на старый файл журнала, даже если его имя изменилось, и может потребоваться перезапуск, чтобы найти новый файл журнала. copytruncate позволяет избежать этого, сохраняя тот же файл, что и активный файл.
logrotate --force $CONFIG_FILE
, указав расположение файла конфигурации, чтобы запустить его вручную.
Для Rails 5 это то, что я должен был сделать, чтобы ограничить размер журнала и не изменять вывод сервера в консоли:
Согласно документации , если вы хотите ограничить размер папки журнала, поместите ее в файл среды ('development.rb' / 'production.rb').
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)
При этом ваши лог-файлы никогда не станут больше 50Мб. Вы можете изменить размер по своему вкусу. «1» во втором параметре означает, что будет сохранен 1 исторический файл журнала, поэтому у вас будет до 100 МБ журналов - текущий журнал и предыдущий блок размером 50 МБ.
config.paths['log'].first
я бы поставилRails.root.join('log', "#{Rails.env}.log")
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
50.megabytes
это то же самое 50 * 1024 * 1024
, но гораздо проще для понимания. Посмотрите расширения ядра ActiveSupport для получения дополнительной информации.
Rails.application.config.paths['log'].first
именно этот файл
Для Rails 5 , если вы хотите ротацию ежедневного журнала, вам нужно только это:
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')
Согласно документации , вы можете использовать daily
, weekly
или monthly
.
Для каждого журнала: журнал Rails, журнал Rpush, ... Вы можете использовать это в своем конфигурационном файле сервиса:
config.log_file = 'log/rpush.log'
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
Это означает: сохранить только 1 предыдущий файл журнала после разделения. Размер основного журнала никогда не превышает 20 МБ.
Включите отправку журналов в loggly, используя rails logglier, как показано в моем файле environment / production.rb. рельсы версия 4.1.0
RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end