Rotasi log produksi Ruby on Rails

172

Apa cara terbaik untuk mengaktifkan rotasi log pada aplikasi produksi Ruby on Rails?

Apakah dengan menggunakan logrotate di server hosting atau apakah ada serangkaian opsi untuk digunakan saat menginisialisasi logger dari aplikasi?

Cnicolaou
sumber
Saya melihat bahwa sudah ada jawaban untuk ini, tetapi saya ingin bertanya apa lingkungan Anda. Saya menggunakan metode syslog + logrotate sendiri, tetapi jelas jenis lingkungannya (apakah berdedikasi, dibagikan; jenis * ix OS hosting, atau yang lain, dll.) Akan memiliki pengaruh di sini.
ylluminate

Jawaban:

203

Opsi 1: syslog + logrotate

Anda dapat mengkonfigurasi rel, untuk menggunakan alat log sistem.

Contoh di config / environment / production.rb .

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

Dengan begitu, Anda masuk ke syslog, dan dapat menggunakan alat logrotate default untuk memutar log.

Opsi 2: log Rails normal + logrotate

Pilihan lain adalah cukup mengkonfigurasi logrotate untuk mengambil log yang ditinggalkan oleh rel. Di Ubuntu dan Debian, misalnya, dalam file bernama /etc/logrotate.d/rails_example_com.

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

Sesuai saran di bawah ini, di Rails disarankan untuk digunakan copytruncate, untuk menghindari keharusan me-restart aplikasi Rails.

Sunting: dihapus "sharedscripts / endscript" karena tidak digunakan di sini dan menimbulkan masalah sesuai komentar Dan dihapus create 640 root admsesuai komentar yang disarankan.

berkes
sumber
3
Untuk menggunakan logrotate, haruskah baris "config.logger = SyslogLogger.new" di config / environment / production.rb tetap dikomentari, atau harus dihapus komentar?
robertwbradford
2
Itu harus tetap dikomentari, sehingga file log ditulis dalam (misalnya): /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Jika menggunakan logrotatesolusi, ada baiknya jawaban @ amit-saxena - menyarankan penggunaan copytruncatelebih dari createarahan.
Tom Harrison
3
Ketika Anda menggunakan copytruncate, createtidak memiliki efek, jadi Anda mungkin harus menghapusnya dari contoh Anda
Michaël Witrant
3
Anda mungkin juga harus menambahkan baris su your_rails_user your_rails_groupdengan pemilik dan grup file log Anda (yaitu, orang-orang dari proses Rails / Penumpang) atau (versi terbaru?) Logrotate dapat mengeluh tentang izin.
oseiskar
56

Jika Anda menggunakan logrotate maka Anda dapat memilih salah satu opsi yang ditunjukkan di bawah ini dengan menempatkan file conf di direktori /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
}

Atau

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

Harap dicatat bahwa copytruncate membuat salinan cadangan dari log saat ini dan kemudian menghapus file log untuk penulisan selanjutnya. Alternatifnya adalah menggunakan create yang akan melakukan rotasi dengan mengganti nama file saat ini dan kemudian membuat file log baru dengan nama yang sama dengan file lama. Saya sangat menyarankan Anda menggunakan copytruncate kecuali Anda tahu bahwa Anda perlu membuat. Alasan mengapa Rails masih tetap menunjuk ke file log lama meskipun namanya telah berubah dan mereka mungkin perlu memulai ulang untuk menemukan file log baru. copytruncate menghindari ini dengan menjaga file yang sama dengan file yang aktif.

amit_saxena
sumber
Tapi bukankah saya harus memulai kembali rel setiap kali logrotate berjalan?
lzap
2
Memotong file log asli di tempat setelah membuat salinan, alih-alih memindahkan file log lama dan secara opsional membuat yang baru, Ini dapat digunakan ketika beberapa program tidak dapat diberitahu untuk menutup logfile-nya dan dengan demikian dapat terus menulis (menambahkan) ke file log sebelumnya selamanya. Perhatikan bahwa ada irisan waktu yang sangat kecil antara menyalin file dan memotongnya, sehingga beberapa data log mungkin hilang. Ketika opsi ini digunakan, opsi buat tidak akan berpengaruh, karena file log lama tetap di tempatnya.
lzap
1
Anda tidak perlu memulai ulang rel jika Anda menggunakan copytruncate karena masih menunjuk ke file log yang sama.
amit_saxena
Apakah konfigurasi mengharuskan Anda untuk menyatakan kapan harus memutar log? seperti "mingguan" atau "ukuran = 20 jt"? Atau bisakah Anda menghilangkannya, jika Anda hanya ingin menjalankan logrotate secara manual?
Damainman
1
Saya tidak yakin apakah saya memahami pertanyaan Anda dengan benar, tetapi Anda perlu menentukan kriteria untuk rotasi log otomatis. Jika Anda tidak menginginkannya otomatis, jangan letakkan file di direktori /etc/logrotate.d/, simpan di tempat lain. Anda kemudian dapat menjalankan logrotate --force $CONFIG_FILEdengan menentukan lokasi file konfigurasi untuk menjalankannya secara manual.
amit_saxena
31

Untuk Rails 5, inilah yang harus saya lakukan untuk membatasi ukuran log dan tidak mengubah output server di konsol:

Menurut dokumentasi , jika Anda ingin membatasi ukuran folder log, letakkan ini di file lingkungan Anda ('development.rb' / 'production.rb').

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

Dengan ini, file log Anda tidak akan pernah tumbuh lebih besar dari 50 MB. Anda dapat mengubah ukuran sesuai keinginan Anda. Tanda '1' pada parameter kedua berarti bahwa 1 file log historis akan disimpan, sehingga Anda akan memiliki hingga 100 MB log - log saat ini dan potongan sebelumnya 50 MB.

Sumber untuk solusi ini .

Sesama Asing
sumber
2
Argumen pertama adalah nama file, cukup berbicara, yaitu 'log / development.log'. Jadi saya lebih suka lebih lama, tapi transparan. Alih-alih config.paths['log'].firstsaya menempatkanRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski
1
@ZiaUlRehmanMughal Ya, ia bekerja dengan Rails 4. Saya menggunakan Rails 4.2.3, dengan konfigurasi seperti ini: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS
1
Untuk membuatnya lebih mudah dibaca, perlu disebutkan bahwa Anda dapat mengandalkan ekstensi byte ActiveSupport: 50.megabytessama dengan 50 * 1024 * 1024, tetapi jauh lebih mudah dipahami. Lihat ekstensi inti ActiveSupport untuk detail lebih lanjut.
Pierre-Adrien Buisson
1
Sampai di sini lagi setelah beberapa googling (kehidupan programmer: D). Saya bertanya-tanya apakah kita dapat mengkonfigurasi baris ini untuk memutar semua file log di folder log? Rupanya baris ini hanya akan memutar baris pertama.
Zia Ul Rehman Mughal
Perhatikan bahwa ini hanya akan memutar file log / production.log Anda sebagai Rails.application.config.paths['log'].firstpengembalian tepat file ini
valachi
5

Untuk Rails 5 , jika Anda menginginkan rotasi log harian, Anda hanya perlu ini:

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

Menurut dokumentasi , Anda dapat menggunakan daily, weeklyatau monthly.

Rael Gugelmin Cunha
sumber
2

Untuk setiap log: Log rel, Rpush log, ... Anda dapat menggunakan seperti ini di file layanan config Anda:

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

Artinya: hanya menyimpan 1 file log sebelumnya setelah dipisah. Ukuran log utama tidak pernah lebih dari 20 MB.

ThienSuBS
sumber
-9

Aktifkan untuk mengirim log ke loggly menggunakan logglier rails seperti berikut dalam file environment / production.rb saya. versi rel adalah 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
riya khana
sumber
Tolong sarankan saya sesuatu yang harus dilakukan ... kode ini tidak berfungsi
riya khana
Versi Rails adalah 4.1.0 & Versi Ruby adalah 2.1.1
riya khana