Ruby on Rails üretim kaydı rotasyonu


172

Ruby on Rails üretim uygulamasında günlük rotasyonunu etkinleştirmenin en iyi yolu nedir?

Barındırma sunucusunda logrotate kullanarak mı yoksa günlükçü uygulamadan başlatırken kullanılacak bir dizi seçenek var mı?


Bunun zaten bir cevabı olduğunu görüyorum, ama çevrenizin ne olduğunu sormak istedim. Syslog + logrotate yöntemini kendim kullanıyorum, ancak açıkçası ortam türü (adanmış, paylaşılan; ne tür * ix OS barındırıyor veya başka bir şey, vb.) Burada bir miktar taşıyıcı olacaktır.
ylluminate

Yanıtlar:


203

1.Seçenek: Syslog + Logrotate

Rayları, sistem günlük araçlarını kullanmak üzere yapılandırabilirsiniz.

Config / environment / production.rb dosyasına bir örnek .

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

Bu şekilde, syslog'da oturum açarsınız ve günlükleri döndürmek için varsayılan logrotate araçlarını kullanabilirsiniz.

Seçenek 2: Normal Rails Günlükleri + Logrotate

Başka bir seçenek de logrotate'i rayların bıraktığı günlükleri alacak şekilde yapılandırmaktır. Ubuntu ve Debian'da bu örneğin adlı bir dosyada olabilir /etc/logrotate.d/rails_example_com.

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Aşağıdaki önerilere göre copytruncate, Rails uygulamasında Rails uygulamasını yeniden başlatmak zorunda kalmamak için kullanılması tavsiye edilir .

Düzenleme: burada kullanılmadıkları ve yoruma göre sorunlara neden olduğu için "sharedscripts / endscript" kaldırıldı. Ve create 640 root admönerilen yorum başına kaldırıldı .


3
Logrotate'i kullanmak için, config / environment / production.rb dosyasındaki "config.logger = SyslogLogger.new" satırı açıklanmamalı mı yoksa önerilmemeli mi?
robertwbradford

2
Günlük dosyalarının yazılması için yorumlanmış olarak kalmalıdır (örneğin): /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
logrotateÇözüm kullanılıyorsa, @ amit-saxena'nın cevabına değer - yönerge copytruncateüzerinden kullanılmasını önerir create.
Tom Harrison

3
Eğer kullandığınız zaman copytruncate, createmuhtemelen örneğin çıkarın bu yüzden, hiçbir etkisi yoktur
Michaël Witrant

3
Ayrıca su your_rails_user your_rails_group, günlük dosyalarınızın sahibine ve grubuna (örneğin, Raylar / Yolcu işlemindekiler) veya (??) Son sürümlerinin logosuna satır eklemeniz izinlerden şikayet edebilir.
oseiskar

56

Logrotate kullanıyorsanız, /etc/logrotate.d/ dizinine bir conf dosyası yerleştirerek aşağıda gösterilen seçeneklerden birini seçebilirsiniz.

# 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
}

Veya

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

Copytruncate öğesinin geçerli günlüğün yedek bir kopyasını oluşturduğunu ve daha sonra yazmaya devam etmek için günlük dosyasını temizlediğini lütfen unutmayın. Alternatif, geçerli dosyayı yeniden adlandırarak ve ardından eski dosyayla aynı ada sahip yeni bir günlük dosyası oluşturarak rotasyonu gerçekleştirecek olan create öğesini kullanmaktır. Oluşturmanız gerektiğini bilmiyorsanız copytruncate komutunu kullanmanızı kesinlikle öneririz . Nedeni, adı değişse bile Rails'in eski günlük dosyasını işaret etmeye devam edebilmesidir ve yeni günlük dosyasını bulmak için yeniden başlatılması gerekebilir. copytruncate, etkin dosyayla aynı dosyayı koruyarak bunu önler.


Ama her logrotate çalıştırıldığında rayları yeniden başlatmamalıyım?
lzap

2
Bir kopya oluşturduktan sonra eski günlük dosyasını taşımak ve isteğe bağlı olarak yeni bir dosya oluşturmak yerine orijinal günlük dosyasını yerinde kesin, Bazı programın günlük dosyasını kapatması söylenemediğinde ve böylece yazmaya devam edebilir (ekleyerek) bir önceki günlük dosyası sonsuza kadar. Dosyayı kopyalayıp kısaltmak arasında çok küçük bir zaman dilimi olduğunu unutmayın, bu nedenle bazı günlük verileri kaybolabilir. Bu seçenek kullanıldığında, eski günlük dosyası yerinde kaldığından oluşturma seçeneğinin bir etkisi olmaz.
lzap

1
Hala aynı günlük dosyasına işaret ettiğinden copytruncate kullanıyorsanız rayları yeniden başlatmanız gerekmez.
amit_saxena

Yapılandırma, günlüklerin ne zaman döndürüleceğini belirtmenizi gerektiriyor mu? "haftalık" veya "size = 20M" gibi? Veya yalnızca logrotate'i manuel olarak çalıştırmak istemeniz durumunda bunu atlayabilir misiniz?
Damainman

1
Sorunuzu doğru anladığımdan emin değilim, ancak otomatik günlük döndürme için bir ölçüt belirtmeniz gerekiyor. Otomatik olmasını istemiyorsanız, dosyayı /etc/logrotate.d/ dizinine koymayın, başka bir yerde saklayın. Daha sonra logrotate --force $CONFIG_FILEel ile çalıştırmak için yapılandırma dosyasının konumunu belirterek çalıştırabilirsiniz.
amit_saxena

31

Rails 5 için, günlük boyutunu sınırlamak ve konsoldaki sunucu çıktısını değiştirmek için yapmam gereken şey buydu:

Belgelere göre , günlük klasörünün boyutunu sınırlamak istiyorsanız, bunu ortam dosyanıza ('development.rb' / 'production.rb') koyun.

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

Bununla, günlük dosyalarınız hiçbir zaman 50 MB'den büyük olmayacaktır. Boyutu kendi tercihinize göre değiştirebilirsiniz. İkinci parametredeki '1', 1 tarihi günlük dosyasının saklanacağı anlamına gelir, böylece 100 MB'a kadar günlükünüz olur - geçerli günlük ve 50 MB'lık önceki yığın.

Bu çözümün kaynağı .


2
İlk argüman dosya adı, basitçe konuşmak gerekirse, yani 'log / development.log'. Bu yüzden daha uzun ama şeffaf bir yolu tercih ederim. Yerine config.paths['log'].firstkoymak istiyorumRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski

1
@ZiaUlRehmanMughal Evet, Rails 4 ile çalışıyor. Rails 4.2.3, şu şekilde yapılandırmayla kullanıyorum: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS

1
Bunu daha kolay okumak için, ActiveSupport bayt uzantılarına güvenebileceğinizden bahsetmeye değer: 50.megabytesaynı 50 * 1024 * 1024, ancak anlaşılması çok daha kolay. Daha fazla ayrıntı için ActiveSupport çekirdek uzantılarına bakın.
Pierre-Adrien Buisson

1
Bazı googling sonra tekrar geldi (programcı yaşam: D). Bu satırı günlük klasöründeki tüm günlük dosyalarını döndürmek için yapılandırabilir miyiz diye merak ediyordum. Görünüşe göre bu çizgi sadece ilk satırı döndürecek.
Zia Ul Rehman Mughal

Bunun yalnızca log / production.log dosyanızı Rails.application.config.paths['log'].firsttam olarak bu dosyayı döndürürken döndüreceğini
unutmayın

5

Rails 5 için günlük kayıt rotasyonu istiyorsanız, sadece buna ihtiyacınız vardır:

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

Belgelere göre daily, weeklyveya kullanabilirsiniz monthly.


2

Her günlük için: Rails günlüğü, Rpush günlüğü, ... Yapılandırma hizmet dosyanızda şu şekilde kullanabilirsiniz:

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

Bu şu anlama gelir: sadece bir önceki günlük dosyasını bölmeden sonra kaydedin. Ana günlük boyutu asla 20 MB'ın üzerinde değildir.


-9

Ortamlarım / production.rb dosyamda aşağıdaki gibi raylar günlükçüsünü kullanarak günlüklere günlük göndermeyi etkinleştir. rayların sürümü 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

Lütfen bana ne yapacağımı öner ... bu kod çalışmıyor
riya khana

Rails versiyonu 4.1.0 ve Ruby'nin versiyonu 2.1.1
riya khana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.