Ротация журнала производства Ruby on Rails

172

Как лучше всего включить ротацию журналов в производственном приложении Ruby on Rails?

Это с помощью logrotate на хостинг-сервере или есть набор опций для инициализации регистратора из приложения?

cnicolaou
источник
Я вижу, что на этот вопрос уже есть ответ, но я хотел спросить, какова ваша среда. Я сам использую метод syslog + logrotate, но очевидно, что тип среды (будь то выделенная, совместно используемая; какой тип * ix OS размещает, или другой, и т. Д.) Будет иметь здесь какое-то отношение.
Иллюминат

Ответы:

203

Вариант 1: системный журнал + logrotate

Вы можете настроить рельсы, использовать инструменты системного журнала.

Пример в config / средах / production.rb .

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

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

Вариант 2: обычные журналы Rails + logrotate

Другой вариант - просто настроить 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согласно предложенному комментарию.

Беркеш
источник
3
Чтобы использовать logrotate, должна ли строка «config.logger = SyslogLogger.new» в config / environment / production.rb оставаться закомментированной или она должна быть не закомментирована?
Робертбрадфорд
2
Он должен оставаться закомментированным, чтобы файлы журнала записывались в (например): /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Если вы используете logrotateрешение, оно стоит ответа @ amit-saxena - предлагает использовать copytruncateболее чем createдирективу.
Том Харрисон
3
Когда вы используете copytruncate, не createимеет никакого эффекта, так что вы, вероятно, должны удалить его из своего примера
Микаэль Витрант
3
Вам также может потребоваться добавить строку su your_rails_user your_rails_groupс владельцем и группой файлов журналов (т. Е. Файлов процесса Rails / Passenger) или (последние версии?) Logrotate может пожаловаться на разрешения.
oseiskar
56

Если вы используете 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 позволяет избежать этого, сохраняя тот же файл, что и активный файл.

amit_saxena
источник
Но не должен ли я перезапускать рельсы при каждом запуске logrotate?
lzap
2
Обрезать исходный файл журнала на месте после создания копии, вместо перемещения старого файла журнала и, при необходимости, создания нового. Его можно использовать, когда какой-либо программе нельзя сказать, чтобы она закрыла свой файл журнала и, таким образом, могла продолжить запись (добавление) в предыдущий файл журнала навсегда. Обратите внимание, что между копированием файла и его усечением существует очень маленький временной интервал, поэтому некоторые данные журналов могут быть потеряны. Когда используется эта опция, опция создания не будет иметь никакого эффекта, так как старый файл журнала остается на месте.
lzap
1
Вам не нужно перезапускать рельсы, если вы используете copytruncate, потому что он все еще указывает на тот же файл журнала.
amit_saxena
Требует ли конфигурация указывать, когда вращать журналы? такие как "еженедельно" или "размер = 20M"? Или вы можете опустить это, если вы хотите запустить logrotate только вручную?
Damainman
1
Я не уверен, правильно ли я понял ваш вопрос, но вам нужно указать критерий автоматической ротации логов. Если вы не хотите, чтобы он был автоматическим, не помещайте файл в каталог /etc/logrotate.d/, оставьте его в другом месте. Затем вы можете запустить logrotate --force $CONFIG_FILE, указав расположение файла конфигурации, чтобы запустить его вручную.
amit_saxena
31

Для Rails 5 это то, что я должен был сделать, чтобы ограничить размер журнала и не изменять вывод сервера в консоли:

Согласно документации , если вы хотите ограничить размер папки журнала, поместите ее в файл среды ('development.rb' / 'production.rb').

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)

При этом ваши лог-файлы никогда не станут больше 50Мб. Вы можете изменить размер по своему вкусу. «1» во втором параметре означает, что будет сохранен 1 исторический файл журнала, поэтому у вас будет до 100 МБ журналов - текущий журнал и предыдущий блок размером 50 МБ.

Источник к этому решению .

Незнакомец
источник
2
Первый аргумент - это просто имя файла, то есть «log / development.log». Поэтому я бы предпочел более длинный, но прозрачный способ. Вместо этого config.paths['log'].firstя бы поставилRails.root.join('log', "#{Rails.env}.log")
Михаил Чупринский
1
@ZiaUlRehmanMughal Да, это работает с Rails 4. Я использую Rails 4.2.3, с настройкой, подобной этой: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS
1
Чтобы облегчить чтение, стоит упомянуть, что вы можете положиться на расширения байтов ActiveSupport: 50.megabytesэто то же самое 50 * 1024 * 1024, но гораздо проще для понимания. Посмотрите расширения ядра ActiveSupport для получения дополнительной информации.
Пьер-Адриен
1
Попал сюда снова после некоторого поиска в интернете (жизнь программиста: D). Мне было интересно, если мы можем настроить эту строку для поворота всех файлов журнала в папке журнала? По всей видимости, эта линия будет вращаться только первой.
Зия Уль Рехман
Обратите внимание, что это будет вращать только ваш файл log / production.log, так как вы получите Rails.application.config.paths['log'].firstименно этот файл
valachi
5

Для Rails 5 , если вы хотите ротацию ежедневного журнала, вам нужно только это:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

Согласно документации , вы можете использовать daily, weeklyили monthly.

Раэль Гугельмин Кунья
источник
2

Для каждого журнала: журнал Rails, журнал Rpush, ... Вы можете использовать это в своем конфигурационном файле сервиса:

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

Это означает: сохранить только 1 предыдущий файл журнала после разделения. Размер основного журнала никогда не превышает 20 МБ.

ThienSuBS
источник
-9

Включите отправку журналов в 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
Рия Хана
источник
Пожалуйста, предложите мне что-нибудь, что делать ... этот код не работает
Рия Хана
Версия Rails - 4.1.0, а версия Ruby - 2.1.1
Рия Хана,