Bagaimana saya bisa menonaktifkan logging pesan pipeline aset (sprocket) di Ruby on Rails 3.1?

378

Sprockets cenderung sangat bertele-tele dalam log (dev) secara default di bawah Ruby on Rails 3.1 (RC1):

Started GET "/assets/application.css" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/application.css.scss  (5ms)  (pid 6303)


Started GET "/assets/application.js" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/default.css.scss  (15ms)  (pid 6303)

...
Started GET "/assets/default/header_bg.gif" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Served asset /default/header_logo.gif - 304 Not Modified  (7ms)  (pid 6303)
Served asset /default/header_bg.gif - 304 Not Modified  (0ms)  (pid 6246)
Served asset /default/footer_bg.gif - 304 Not Modified  (49ms)  (pid 6236)
...

Saya ingin mengurangi tingkat verbositas atau menonaktifkannya sama sekali.

Saya berasumsi ada cara bersih untuk menonaktifkan atau mengurangi verbositas dari logging dengan menambahkan baris config di salah satu environment.rbatau development.rbmirip dengan config.active_record.logger = nilyang membungkam pernyataan SQL ActiveRecord.

istvanp
sumber
Seseorang melaporkan bug tentang ini: # 2639 . Masih "terbuka" pada 9/2.
istvanp
14
Jawaban yang diterima untuk pertanyaan ini harus diubah atau diperbarui. Di Rails 3.2 Anda bisa memasukkan config.assets.debug = falsedevelopment.rb.
Stewart Johnson
7
@StewartJohnson - config.assets.debug = falseakan menyatukan aset ke dalam satu file - bukan yang diinginkan kebanyakan orang dalam pengembangan
Yarin

Jawaban:

382

Masukkan kode berikut ini config/initializers/quiet_assets.rb

if Rails.env.development?
  Rails.application.assets.try(:logger=, Logger.new('/dev/null'))
  Rails::Rack::Logger.class_eval do
    def call_with_quiet_assets(env)
      previous_level = Rails.logger.level
      Rails.logger.level = Logger::ERROR if env['PATH_INFO'] =~ %r{^/assets/}
      call_without_quiet_assets(env)
    ensure
      Rails.logger.level = previous_level
    end
    alias_method_chain :call, :quiet_assets
  end
end

Diperbarui: Sekarang juga berfungsi untuk Ruby on Rails 3.2 (perbaikan upaya sebelumnya before_dispatch, dan sekarang kami akan menggunakan rak root callsebagai gantinya)

Pembaruan: Solusi rak middleware yang tepat (bukan rapuh alias_method_chain) dari @macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735

choonkeat
sumber
3
Pada Rails 3.2.1 tarikan itu sendiri tidak memadamkan sproket logging dan file choonkeat masih diperlukan.
IAmNaN
5
Memang. Kedengarannya file ini akan selalu dibutuhkan, karena pengaturan config.assets.loggerke false hanya akan membungkam apa yang dihasilkan Sprockets. Paket Tindakan ini membungkam permintaan / tanggapan, yang merupakan sesuatu yang dikatakan Rails dev tidak berniat diam untuk kasus-kasus khusus .
Ben Kreeger
32
uhm Anda hanya harus mendapatkan ini ke inti rel. menjadikannya pilihan di config.assets
jsharpe
2
Pada windows ganti '/dev/null'dengan ' NUL'
Matt
4
Bekerja untuk saya di Rails 4.2.0
mesin serial
189

Lihatlah https://github.com/evrone/quiet_assets dan cukup sertakan ke dalam file Gem Anda.

Untuk yang malas: gem 'quiet_assets', group: :development

rute
sumber
6
Kerja bagus, tetapi sangat sedih bahwa permata terpisah diperlukan untuk ini.
Adam Spires
1
Saya pikir Jose Valim membuat keputusan yang tepat di sini github.com/rails/rails/issues/2639 rails harus mencatat semua permintaan yang masuk dan saya setuju dengan itu, saya pikir kita bisa menyingkirkan overhead ini ketika sprocket akan mendukung peta sumber github.com / sstephenson / sprockets / issues / 310
route
5
untuk yang malas: gem 'quiet_assets'(silakan tambahkan ini ke posting :))
reto
52

Untuk Ruby on Rails 3.2, tambahkan config.assets.logger = falseke file konfigurasi lingkungan pengembangan Anda, biasanya ditemukan di config/environments/development.rb. Lihat # 4512 .

ouranos
sumber
Bekerja di Naikkan 4 seperti yang diharapkan. Diperlukan untuk me-restart server untuk membuatnya berfungsi.
Langusten Gustel
2
Rails 4.0.2 config.assets.logger = nilbekerja untuk saya
byterussia
4
Rails 4.0.4 config.assets.logger = nilTIDAK bekerja untuk saya
hendrikbeck
28

Dua hal sudah cukup:

  1. config.assets.debug = false di config/enviroments/development.rb
  2. rake assets:precompile. Lihat komentar oleh @oma di bawah ini; ini tidak diperlukan

Itu saja!

Lisovsky Vlad
sumber
19
1. benar. Terima kasih! Harap hapus No 2. rake assets:precompilebukan sesuatu yang ingin kami lakukan dalam pengembangan
oma
Meskipun ini mungkin tidak berfungsi pada saat pertanyaan aslinya diposting, ia berfungsi sekarang (dan, seperti yang @Race nyatakan, sudah 3.2) dan seharusnya jawabannya sekarang diterima.
radiospiel
2
Seperti yang ditunjukkan istvanp di bawah ini, itu tidak melakukan apa yang Anda pikirkan. Ini hanya mengkompilasi semua aset JS dan CSS menjadi satu file besar - tidak mematikan pencatatan untuk aset.
davidgoli
2
Ini semua yang diperlukan di kereta 4.2.2
kapal ini
Menambahkan apa yang dikatakan @davidgoli: config.assets.debug mengontrol penggabungan aset. Mematikan itu berarti bahwa debugging misalnya JS dan CSS menggunakan browser akan menjadi lebih banyak pekerjaan. Sesuatu seperti quiet_assets akan memadamkan pencatatan tanpa menyebabkan Anda harus beralih aset.
johncip
27

Pada akhirnya, itu akan terjadi config.assets.logger = nil, tetapi bagian itu saat ini masih belum dibaca di master (belum selesai).

berkaki tiga
sumber
5
Tidak bekerja untuk saya di Rails 3.1.3. @nessur: Anda yakin itu bekerja untuk Anda? Seperti yang dikatakan Tim, # 2639 masih terbuka, dan saya tidak melihat indikasi dalam masalah perbaikan apa pun (kedua permintaan tarikan yang direferensikan ditolak).
Adam Spires
Ini tidak akan diimplementasikan sebagai tahap ini. github.com/rails/rails/issues/4569
23inhouse
@AdamSpiers sesuai tautan: github.com/rails/rails/pull/3795#issuecomment-3549669 "Rails tidak akan membuat case khusus salah satu penebang atau middlewares terkait logger untuk tidak mencatat rute tertentu"
23inhouse
3
Kekecewaan. Rails 4 masih tidak dapat dengan mudah menonaktifkan logging aset.
Tom Rossi
1
Saya menggunakan Rails 4.2, memasukkan ini ke saya development.rb, dan itu menonaktifkan logging aset.
Jack
12

Saya tahu ini solusi yang jelek dan sementara, tetapi saya menggunakan ini:

tail -f log / development.log | grep -vE 'aset'

Sucrenoir
sumber
9
Inilah yang diperbaiki yang menghilangkan garis-garis kosong juga:tail -f log/development.log | grep -vE "(^\s*$|asset)"
istvanp
12

Banyak orang bingung tentang penggunaan config.assets.logger = false. Inilah yang dilakukan dan tidak dilakukan.

Menurut sumber dokumentasi :

Pengaturan config.assets.loggerke false akan mematikan pencatatan aset yang dilayani.

Namun ini mungkin bukan apa yang Anda pikirkan. Ini hanya menonaktifkan log 'penayangan' sprocket , bukan log permintaan actionpack Ruby on Rails. Pengelola Ruby on Rails menjelaskan hal ini dengan jelas di sini: https://github.com/rails/rails/issues/4569#issuecomment-3594500


Mengambil contoh dari tautan, log seperti ini dinonaktifkan:

Aset yang dilayani /jquery.isotope.js - 304 Tidak Dimodifikasi (0ms)

Tapi log seperti ini bukan

Mulai DAPATKAN "/assets/jquery.isotope.js?body=1" untuk 127.0.0.1 di 2012-01-20 23:16:46 -0500

lalalala
sumber
10
config.assets.quiet = true

Ini cara terbaru untuk pergi.

Adam Waite
sumber
Berfungsi sempurna di Rails 5. Hanya buang ini ke dalamdevelopment.rb
Andreykul
Ditambah dengan debug, tidak menyelesaikan semua kebutuhan saya di Rails 5.
Pysis
7

Menggunakan:

Rails.application.assets.logger = Logger.new(RUBY_PLATFORM =~ /(win|w)32$/ ? "NUL" : "/dev/null")
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end

Ini adalah kode choonkeat yang sama ditambahkan . Saya hanya memasukkannya untuk bekerja di bawah Windows juga.

Celso Dantas
sumber
7

Dalam file development.rb di config / environment Anda akan menemukan baris tersebut config.assets.debug = true.

Alihkan itu ke falsedan sebagian besar output beban aset akan hilang. Di sistem saya hanya dua permintaan, untuk application.css dan .js, yang tersisa.

TKAB
sumber
3
Pengaturan itu hanya memungkinkan Anda untuk memecah stylesheet dan javascript ke dalam file terpisah ketika disetel ke true untuk memudahkan debugging. Jika disetel ke false (default), bundel semuanya menjadi satu file besar. Jadi memang mengurangi output debug tetapi jika Anda memiliki gambar misalnya, mereka tidak terpengaruh sama sekali. Info panduan resmi di sini .
istvanp
1
Saya melihat. Terima kasih sudah membereskannya. Tapi saya tidak mengubah pengaturan variabel ini, jadi standar saya adalah true.
TKAB
5

Dalam file config / environment / development.rb silakan tambahkan:

config.assets.debug = false

config.assets.logger = false
Najam Tariq
sumber
2

Lograge untuk menang - ini akan meniadakan default logger yang mengganggu Ruby on Rails (misalnya, mencatat aset, mencatat rendering sebagian) dan dapat disesuaikan jika Anda ingin menambah / menghapus item tertentu.

Yarin
sumber
0

Solusi tertaut yang disebutkan sebelumnya membantu:

https://github.com/evrone/quiet_assets

Juga seperti di bawah ini, itu berfungsi dengan baik untuk saya:

3,1 (hanya) (3,2 jeda sebelum_dipatch)

app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end
3.2 Rails - Rack root tap approach
app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end
Sumit Munot
sumber
-1

Dalam config / environment, tambahkan config.log_level = :errorke file .rb yang ingin Anda ubah. Ini akan mengubah pengaturan log menjadi kesalahan saja.

Chris O
sumber
Sayangnya tidak karena saya kebanyakan menggunakan log untuk melihat data permintaan dan SQL yang berada di tingkat debug. Pesan aset adalah tingkat info (yang lebih rendah dari tingkat debug) sehingga tidak ada gunanya mendapatkan apa yang saya inginkan dengan pengaturan itu.
istvanp
2
Ini bukan ide yang bagus. Ini akan menyembunyikan pesan level info lain yang Anda mungkin ingin tetap login.
ifightcrime