Обертання журналу виробництва Ruby on Rails


172

Який найкращий спосіб увімкнути поворот журналу у виробничому додатку Ruby on Rails?

Це за допомогою логротета на сервері хостингу чи є набір варіантів, які слід використовувати при ініціалізації реєстратора з програми?


Я бачу, що відповідь на це вже є, але я хотів запитати, яке ваше оточення. Я сам використовую метод syslog + logrotate, але очевидно, що таке середовище (будь то виділене, спільне; яка саме * ix OS хостинг, чи інша тощо) має певне значення тут.
іллюмінат

Відповіді:


203

Варіант 1: syslog + логротат

Ви можете налаштувати рейки, використовувати інструменти системного журналу.

Приклад в config / середовища / production.rb .

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

Таким чином, ви входите в syslog і можете використовувати інструменти логротату за замовчуванням для обертання журналів.

Варіант 2: нормальний журнал Rails + логротат

Інший варіант - просто налаштувати логротат, щоб забрати колоди, залишені рейками. У 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 / середовища / production.rb, чи це не слід коментувати?
robertwbradford

2
Залишається коментувати, щоб файли журналів були записані (наприклад): /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
Якщо ви використовуєте logrotateрішення, варто відповісти @ amit-saxena - пропонує використовувати copytruncateнад createдирективою.
Том Гаррісон

3
Коли ви користуєтесь copytruncate, createце не має ефекту, тому ви, ймовірно, повинні видалити його зі свого прикладу
Michaël Witrant

3
Можливо, вам також доведеться додати рядок su your_rails_user your_rails_groupіз власником і групою ваших журнальних файлів (тобто файлів процесу Rails / Passenger) або (останні версії?) Logrotate, можуть скаржитися на дозволи.
осейскар

56

Якщо ви використовуєте logrotate, ви можете вибрати будь-який із наведених нижче варіантів, розмістивши файл конф в каталозі /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 уникає цього, зберігаючи той самий файл, що і активний файл.


Але чи не слід перезапускати рейки щоразу, коли проходить логротат?
lzap

2
Обрізайте оригінальний файл журналу на місці після створення копії, замість переміщення старого файлу журналу та необов'язково створення нового, його можна використовувати, коли якійсь програмі не можна сказати закрити свій файл журналу і, таким чином, може продовжувати писати (додавати) до попередній файл журналу назавжди. Зауважте, що між копіюванням файла та обрізанням файлу існує дуже невеликий проміжок часу, тому деякі дані журналу можуть бути втрачені. Якщо використовується ця опція, опція створення не матиме ефекту, оскільки старий файл журналу залишається на місці.
lzap

1
Вам не потрібно перезапускати рейки, якщо ви використовуєте copytruncate, оскільки він все ще вказує на той самий файл журналу.
amit_saxena

Чи потрібна конфігурація, щоб ви вказали, коли потрібно обертати журнали? наприклад "тиждень" чи "розмір = 20М"? Або можете пропустити це, якщо ви хочете запускати логротат лише вручну?
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 історичний файл журналу, тож у вас буде до 100Mb журналів - поточний журнал та попередній фрагмент 50Mb.

Джерело цього рішення .


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). Мені було цікаво, чи можемо ми налаштувати цей рядок, щоб обертати всі файли журналу в папці журналу? Мабуть, ця лінія обертається лише перший рядок.
Zia Ul Rehman

Зауважте, що це поверне лише файл 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

Для кожного журналу: Журнал рейок, Журнал запуску, ... Ви можете користуватися таким чином у своєму конфігураційному файлі служби:

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

Це означає: зберігати лише 1 попередній файл журналу після розбиття. Розмір основного журналу ніколи не перевищує 20 Мб.


-9

Увімкнути для надсилання журналів у loggly за допомогою рейки logglier у наступному моєму файлі середовища / 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
Рія-хана
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.