Làm cách nào tôi có thể vô hiệu hóa ghi nhật ký các thông báo đường dẫn tài sản (sprockets) trong Ruby on Rails 3.1?


378

Sprockets có xu hướng khá dài dòng trong nhật ký (dev) theo mặc định trong 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)
...

Tôi muốn giảm mức độ dài dòng hoặc vô hiệu hóa nó hoàn toàn.

Tôi giả sử có một cách rõ ràng để vô hiệu hóa hoặc giảm mức độ chi tiết của việc ghi nhật ký bằng cách thêm một dòng cấu hình trong một environment.rbhoặc development.rbtương tự để config.active_record.logger = nillàm im lặng các câu lệnh SQL ActiveRecord.


Ai đó đã báo cáo một lỗi về điều này: # 2639 . Vẫn "mở" kể từ ngày 9/2.
istvanp

14
Câu trả lời được chấp nhận cho câu hỏi này nên được thay đổi hoặc cập nhật. Trong Rails 3.2, bạn chỉ có thể đưa config.assets.debug = falsevào sự phát triển của mình.rb.
Stewart Johnson

7
@StewartJohnson - config.assets.debug = falsesẽ ghép các tài sản thành một tệp duy nhất - không phải là thứ mà hầu hết mọi người muốn phát triển
Yarin

Câu trả lời:


382

Đặt mã sau vào 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

Đã cập nhật: Hiện tại nó cũng hoạt động cho Ruby on Rails 3.2 (bản sửa lỗi trước đó before_dispatchvà bây giờ chúng tôi sẽ callthay thế giá gốc )

Cập nhật: Một giải pháp phần mềm trung gian Rack thích hợp (thay vì dễ vỡ alias_method_chain) từ @macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735


3
Kể từ Rails 3.2.1, những cái kéo một mình không làm hỏng việc ghi nhật ký bánh xích và tập tin choonkeat vẫn cần thiết.
IAmNaN

5
Thật. Âm thanh như tập tin này sẽ luôn luôn cần thiết, vì cài đặt config.assets.loggerthành false sẽ chỉ làm im lặng những gì Sprockets đưa ra. Sự im lặng này yêu cầu / phản hồi của Gói hành động, đây là điều mà nhà phát triển Rails nói rằng họ không có ý định im lặng cho những trường hợp đặc biệt .
Ben Kreeger

32
uhm bạn chỉ nên lấy cái này vào lõi ray. làm cho nó trở thành một tùy chọn trong config.assets
jsharpe

2
Trên cửa sổ thay thế '/dev/null'bằng ' NUL'
Matt

4
Hoạt động với tôi trên Rails 4.2.0
động cơ nối tiếp

189

Hãy xem https://github.com/evrone/quiet_assets và chỉ đưa nó vào tệp Gem của bạn.

Dành cho người lười biếng: gem 'quiet_assets', group: :development


6
Công việc tuyệt vời, nhưng rất buồn là cần có một viên đá quý riêng cho việc này.
Adam Spiers

1
Tôi nghĩ Jose Valim đã đưa ra quyết định đúng đắn ở đây github.com/rails/rails/issues/2639 đường ray phải ghi lại tất cả yêu cầu đến và tôi đồng ý với điều đó, tôi nghĩ rằng chúng ta có thể thoát khỏi chi phí này khi sprockets sẽ hỗ trợ bản đồ nguồn github.com / sstephenson / sprockets / vấn đề / 310
tuyến đường

5
cho người lười biếng: gem 'quiet_assets'(vui lòng thêm phần này vào bài đăng :))
reto

52

Đối với Ruby on Rails 3.2, hãy thêm config.assets.logger = falsevào tệp cấu hình môi trường phát triển của bạn, thường được tìm thấy tại config/environments/development.rb. Xem # 4512 .


Hoạt động trong Raise 4 như mong đợi. Cần phải khởi động lại máy chủ để làm việc này.
Langusten Gustel

2
Rails 4.0.2 config.assets.logger = nilhoạt động với tôi
byterussian

4
Rails 4.0.4 config.assets.logger = nilKHÔNG hoạt động với tôi
hendrikbeck

28

Hai điều là đủ:

  1. config.assets.debug = false trong config/enviroments/development.rb
  2. rake assets:precompile. Xem bình luận của @oma bên dưới; cái này không cần

Đó là tất cả!


19
1. đúng. Cảm ơn! Vui lòng xóa số 2. rake assets:precompilekhông phải là điều chúng tôi muốn làm trong quá trình phát triển
oma

Mặc dù điều này có thể không hoạt động tại thời điểm câu hỏi ban đầu được đăng nhưng hiện tại nó đã hoạt động (và, như @Race đã nêu, đã có phiên bản 3.2.3) và bây giờ sẽ có câu trả lời được chấp nhận.
radiospiel

2
Như istvanp chỉ ra dưới đây, điều đó không làm những gì bạn nghĩ nó làm. Nó chỉ biên dịch tất cả các tài sản JS và CSS thành một tệp lớn duy nhất - nó không tắt đăng nhập tài sản.
davidgoli

2
Đây là tất cả những gì cần thiết trong đường ray 4.2.2
bán hàng này

Thêm vào những gì @davidgoli đã nói: config.assets.debug kiểm soát việc nối tài sản. Tắt điều đó có nghĩa là gỡ lỗi, ví dụ như JS và CSS bằng trình duyệt sẽ trở nên hiệu quả hơn. Một cái gì đó giống như quiet_assets sẽ xóa sổ ghi nhật ký mà không khiến bạn phải chuyển tài sản.debug sang, tốt, gỡ lỗi.
johncip

27

Cuối cùng, nó sẽ được config.assets.logger = nil, nhưng phần đó hiện đang được sử dụng trên master (chưa được thực hiện).


5
Không hoạt động với tôi trên Rails 3.1.3. @nessur: bạn có chắc là nó hiệu quả với bạn không? Như Tim nói, # 2639 vẫn mở và tôi không thấy dấu hiệu nào trong vấn đề sửa chữa đó (cả hai yêu cầu kéo được tham chiếu đều bị từ chối).
Adam Spiers

Điều này sẽ không được thực hiện như giai đoạn này. github.com/rails/rails/issues/4569
23

@AdamSpiers theo liên kết: github.com/rails/rails/pull/3795#issuecomment-3549669 "Rails sẽ trường hợp không đặc biệt bất kỳ logger hoặc middlewares logger liên quan đến không đăng các tuyến đường cụ thể"
23inhouse

3
Bummer. Rails 4 vẫn không thể dễ dàng vô hiệu hóa đăng nhập tài sản.
Tom Rossi

1
Tôi đang sử dụng Rails 4.2, đặt cái này vào trong development.rbvà nó đã vô hiệu hóa việc ghi nhật ký tài sản.
Jack

12

Tôi biết đó là một giải pháp xấu xí và tạm thời, nhưng tôi sử dụng nó:

đuôi -f đăng nhập / phát triển.log | grep -vE 'tài sản'


9
Đây là một cải tiến cũng loại bỏ các dòng trống:tail -f log/development.log | grep -vE "(^\s*$|asset)"
istvanp

12

Nhiều người nhầm lẫn về việc sử dụng config.assets.logger = false. Đây là những gì nó làm và những gì nó không làm.

Theo tài liệu nguồn :

Đặt config.assets.loggerthành false sẽ tắt ghi nhật ký tài sản được phục vụ.

Tuy nhiên đây có lẽ không phải là những gì bạn nghĩ. Nó chỉ vô hiệu hóa nhật ký 'phục vụ' , chứ không phải nhật ký yêu cầu gói hành động của Ruby on Rails. Người bảo trì Ruby on Rails giải thích điều này rõ ràng ở đây: https://github.com/rails/rails/issues/4569#issuecomment-3594500


Lấy ví dụ từ liên kết, nhật ký như thế này bị vô hiệu hóa:

Tài sản được phục vụ /jquery.isotope.js - 304 Không được sửa đổi (0ms)

Nhưng nhật ký như thế này thì không

Bắt đầu NHẬN "/assets/jquery.isotope.js?body=1" cho 127.0.0.1 vào 2012-01-20 23:16:46 -0500


10
config.assets.quiet = true

Đây là cách mới nhất để đi.


Hoạt động hoàn hảo trong Rails 5. Chỉ cần đổ cái này vàodevelopment.rb
Andreykul

Cùng với gỡ lỗi, không giải quyết được tất cả các nhu cầu của tôi trong Rails 5.
Pysis 22/03/19

7

Sử dụng:

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

Đó là cùng một mã choonkeat được thêm vào . Tôi chỉ bao gồm nó để làm việc dưới Windows là tốt.


7

Trong tập tin development.rb trong config / các môi trường bạn sẽ tìm thấy những dòng config.assets.debug = true.

Chuyển nó sang falsevà hầu hết đầu ra tải tài sản sẽ biến mất. Trên hệ thống của tôi chỉ còn hai yêu cầu, cho application.css và .js, vẫn còn.


3
Cài đặt đó chỉ cho phép bạn chia các bảng định kiểu và javascript thành các tệp riêng biệt khi được đặt thành đúng để gỡ lỗi dễ dàng hơn. Khi được đặt thành false (mặc định), nó sẽ gộp tất cả chúng thành một tệp lớn. Vì vậy, nó thực sự làm giảm đầu ra gỡ lỗi nhưng nếu bạn có hình ảnh chẳng hạn, những thứ đó hoàn toàn không bị ảnh hưởng. Thông tin hướng dẫn chính thức tại đây .
istvanp

1
Tôi hiểu rồi. Cám ơn giải thích rõ ràng. Nhưng tôi đã không thay đổi cài đặt của biến này, vì vậy mặc định của tôi là true.
TKAB

5

Trong tập tin cấu hình / môi trường / Development.rb vui lòng thêm:

config.assets.debug = false

config.assets.logger = false

2

Lograge for win - nó giết chết logger phiền phức của Ruby on Rails khỏi hộp (ví dụ: ghi nhật ký tài sản, ghi nhật ký một phần) và có thể tùy chỉnh nếu bạn muốn thêm / xóa các mục cụ thể.


0

Các giải pháp liên kết được đề cập trước đây giúp:

https://github.com/evrone/quiet_assets

Cũng như dưới đây, nó hoạt động tốt với tôi:

3,1 (chỉ) (3,2 nghỉ trước_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

-1

Trong cấu hình / môi trường thêm config.log_level = :errorvào các tệp .rb bạn muốn thay đổi. Điều này sẽ thay đổi cài đặt nhật ký thành lỗi.


Thật không may là vì tôi chủ yếu sử dụng nhật ký để xem xét yêu cầu và dữ liệu SQL ở mức gỡ lỗi. Thông báo tài sản có mức thông tin (thấp hơn mức gỡ lỗi) vì vậy không có ích gì khi tôi nhận được những gì tôi muốn với cài đặt đó.
istvanp

2
Đây không phải là ý tưởng tốt. Nó sẽ ẩn các thông báo cấp thông tin khác mà bạn có thể vẫn muốn đăng nhập.
ifightcrime
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.