ChatGPT解决这个技术问题 Extra ChatGPT

How can I disable logging of asset pipeline (sprockets) messages in Ruby on Rails 3.1?

Sprockets tends to be quite verbose in the (dev) log by default under 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)
...

I'd like to either reduce the level of verbosity or disable it altogether.

I'm assuming there is a clean way to disable or reduce the verbosity of the logging by adding a config line in either environment.rb or development.rb similar to config.active_record.logger = nil which silences ActiveRecord SQL statements.

Someone reported a bug about this: #2639. Still "open" as of 9/2.
The accepted answer for this question should be changed or updated. In Rails 3.2 you can just put config.assets.debug = false in your development.rb.
@StewartJohnson - config.assets.debug = false will concatenate assets into a single file- not what most people want in development

P
Peter Mortensen

Place the following code in 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

Updated: It now works for Ruby on Rails 3.2 too (previous attempt fixes before_dispatch, and now we're going for the root rack call instead)

Update: A proper Rack middleware solution (instead of fragile alias_method_chain) from @macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735


As of Rails 3.2.1 those pulls alone do not squelch the sprocket logging and choonkeat's file is still needed.
Indeed. Sounds like this file will always be needed, as setting config.assets.logger to false will only silence what Sprockets outputs. This silences Action Pack requests/responses, which is something that the Rails dev have said they don't intend to silence for special cases.
uhm. you should just get this into rails core. make it an option in config.assets
On windows replace '/dev/null' with 'NUL'
Works for me on Rails 4.2.0
P
Peter Mortensen

Take a look at https://github.com/evrone/quiet_assets and just include it into your Gem file.

For the lazy: gem 'quiet_assets', group: :development


Great work, but very sad that a separate gem is required for this.
I think Jose Valim made right decision here github.com/rails/rails/issues/2639 rails has to log all incoming request and I agree with that, I think we can get rid of this overhead when sprockets will support source map github.com/sstephenson/sprockets/issues/310
for the lazy: gem 'quiet_assets' (please add this to the post :))
P
Peter Mortensen

For Ruby on Rails 3.2, add config.assets.logger = false to your development environment configuration file, typically found at config/environments/development.rb. See #4512.


Works in Raise 4 as expected. Needed to restart the server to make this working.
Rails 4.0.2 config.assets.logger = nil works for me
Rails 4.0.4 config.assets.logger = nil does NOT work for me
P
Peter Mortensen

Two things are enough:

config.assets.debug = false in config/enviroments/development.rb rake assets:precompile. See comment by @oma below; this is not needed

That's all!


1. is correct. Thanks! Please remove No 2. rake assets:precompile is not something we wanna do in development
While this probably didn't work at the time the original question was posted it works now (and, as @Race stated, witl 3.2.3 already) and should therefire be the accepted answer now.
As istvanp points out below, that doesn't do what you think it does. It only compiles all JS and CSS assets into a single large file - it doesn't turn off logging for assets.
This is all that is needed in rails 4.2.2
Adding to what @davidgoli said: config.assets.debug controls asset concatenation. Turning that off means that debugging e.g. JS and CSS using the browser will become more work. Something like quiet_assets will squelch the logging without causing you to have to toggle assets.debug to, well, debug.
P
Peter Mortensen

Eventually, it will be config.assets.logger = nil, but that part is currently stubbed on master (not done yet).


Doesn't work for me either on Rails 3.1.3. @nessur: are you sure it works for you? As Tim says, #2639 is still open, and I see no indication in that issue of any fix (both referenced pull requests were rejected).
This will not be implemented as this stage. github.com/rails/rails/issues/4569
@AdamSpiers as per the link: github.com/rails/rails/pull/3795#issuecomment-3549669 "Rails won't special case any of the loggers or logger related middlewares to not log specific routes"
Bummer. Rails 4 still can't easily disable asset logging.
I'm using Rails 4.2, put this in my development.rb, and it disabled logging of assets.
P
Peter Mortensen

I know it's an ugly and temporary solution, but I use this:

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


Here's an improved one that removes blank lines as well: tail -f log/development.log | grep -vE "(^\s*$|asset)"
P
Peter Mortensen

Many people are confused about the use of config.assets.logger = false. Here is what it does and what it doesn't do.

According the source documentation:

Setting config.assets.logger to false will turn off served assets logging.

However this probably is not what you think it is. It only disables sprocket 'serving' logs, not Ruby on Rails actionpack request logs. The Ruby on Rails maintainer explains this clearly here: https://github.com/rails/rails/issues/4569#issuecomment-3594500

Taking example from the link, logs like this are disabled:

Served asset /jquery.isotope.js - 304 Not Modified (0ms)

But logs like this are not

Started GET "/assets/jquery.isotope.js?body=1" for 127.0.0.1 at 2012-01-20 23:16:46 -0500


A
Adam Waite
config.assets.quiet = true

This is the latest way to go.


Works perfectly in Rails 5. Just dump this into development.rb
Coupled with debug, does not solve all of my needs in Rails 5.
P
Peter Mortensen

Use:

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

It's the same code choonkeat added. I just included it to work under Windows as well.


P
Peter Mortensen

In file development.rb in config/environments you'll find the line config.assets.debug = true.

Switch that to false and most of the asset load output will be gone. On my system only the two requests, for application.css and .js, remain.


That setting only allows you to break the stylesheets and javascript into separate files when set to true for easier debugging. When set to false (the default) it bundles them all into one big file. So it does indeed reduce debug output but if you have images for example, those are not affected at all. Official guide info here.
I see. Thanks for clearing that up. But I did not change the setting of this variable, so my default was true.
P
Peter Mortensen

In file config/environments/development.rb please add:

config.assets.debug = false

config.assets.logger = false

P
Peter Mortensen

Lograge for the win - it kills Ruby on Rails' annoying logger defaults out of the box (e.g. logging assets, logging partial rendering) and is customizable if you want to add/remove specific items.


P
Peter Mortensen

The previously mentioned linked solution helps:

https://github.com/evrone/quiet_assets

Also as below, it's working fine for me:

3.1 (only) (3.2 breaks before_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

P
Peter Mortensen

In config/environments add config.log_level = :error to the .rb files you want to change. This will change the log settings to error only.


Unfortunately no because I mostly use the log for looking at the request and SQL data which are at the debug level. Asset messages are of info level (which is lower than the debug level) so it's no use getting what I want with that setting.
This is not a good idea. It will hide other info level messages that you might want to still be logging.