如何在Ruby on Rails 3.1中禁用资产管道(链轮)消息的日志记录?


378

默认情况下,在Ruby on Rails 3.1(RC1)下,(dev)日志中的链轮往往很冗长:

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)
...

我想降低详细程度或完全禁用它。

我假设有一种干净的方法来禁用或减少日志记录的冗长性,方法是在其中添加一条environment.rb或多条配置行development.rbconfig.active_record.logger = nil使ActiveRecord SQL语句静音。


有人报告了一个有关此错误:#2639。截至9/2仍为“开放”状态。
istvanp 2011年

14
该问题的可接受答案应该更改或更新。在Rails 3.2中,您可以只放入config.assets.debug = false您的development.rb。
斯图尔特·约翰逊

7
@StewartJohnson- config.assets.debug = false将资产连接到一个文件中
Yarin

Answers:


382

将以下代码放入 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

更新:它现在也适用于Ruby on Rails 3.2(先前的尝试修复before_dispatch,现在我们将使用根机架call

更新:alias_method_chain来自@macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735的适当的Rack中间件解决方案(而不是脆弱的)


3
从Rails 3.2.1开始,仅靠这些拉动就不会抑制链轮测井,仍然需要choonkeat的文件。
IAmNaN 2012年

5
确实。听起来总是需要此文件,因为设置config.assets.logger为false只会使Sprockets输出的内容静音。这使Action Pack的请求/响应静音,这是Rails开发人员说的,他们不打算在特殊情况下保持沉默
Ben Kreeger 2012年

32
嗯 您应该只是将其纳入Rails核心。使其成为config.assets中的一个选项
jsharpe 2012年

2
在Windows替换'/dev/null'用“ NUL
马特

4
在Rails 4.2.0上为我工作
串行引擎

189

看一下https://github.com/evrone/quiet_assets,然后将其包含到您的Gem文件中。

对于懒惰的人: gem 'quiet_assets', group: :development


6
很棒的工作,但是很遗憾为此需要单独的宝石。
亚当·斯皮尔斯

1
我认为Jose Valim在这里做出了正确的决定github.com/rails/rails/issues/2639 rails必须记录所有传入的请求,我同意这一点,我认为当链轮将支持源地图github.com
路线

5
对于懒惰者:(gem 'quiet_assets'请添加到帖子中:))
重新

52

对于Ruby on Rails 3.2,将其添加config.assets.logger = false到开发环境配置文件中,该文件通常位于config/environments/development.rb。参见#4512


按预期在Raise 4中工作。需要重新启动服务器才能使其正常工作。
Langusten Gustel

2
Rails 4.0.2 config.assets.logger = nil为我工作
byterussian 2014年

4
Rails 4.0.4 config.assets.logger = nil不适用于我
hendrikbeck 2014年

28

两件事就足够了:

  1. config.assets.debug = falseconfig/enviroments/development.rb
  2. rake assets:precompile请参阅下面@oma的评论;这是不需要的

就这样!


19
1.是正确的。谢谢!请删除2号。rake assets:precompile这不是我们在开发中想要做的事情
2012年

尽管在原始问题发布时这可能不起作用,但现在可以了(正如@Race所说的,已经是3.2.3版了),现在应该可以接受了。
radiospiel

2
正如istvanp在下面指出的那样,这并没有达到您认为的目的。它只会将所有JS和CSS资产编译为一个大文件-不会关闭资产记录。
davidgoli

2
这就是Rails 4.2.2中所需要的一切
thisfeller 2015年

添加到@davidgoli所说的内容:config.assets.debug控制资产串联。禁用此功能意味着使用浏览器进行调试(例如JS和CSS)将变得更加繁琐。诸如quiet_assets之类的东西会压制日志记录,而不会导致您不得不将asset.debug切换到调试。
johncip '16

27

最终,它将是config.assets.logger = nil,但是该部分当前已存入master(尚未完成)。


5
在Rails 3.1.3上也不适合我。@nessur:您确定它对您有用吗?正如Tim所言,#2639仍然处于打开状态,并且我看不到该补丁有任何修复的迹象(两个引用的请求均被拒绝)。
亚当·斯皮尔斯


@AdamSpiers,网址为:github.com/rails/rails/pull/3795#issuecomment-3549669 “路轨不会将任何记录器或与记录器相关的中间件用于特殊情况,以免记录特定的路线”
23inhouse,2013年

3
笨蛋 Rails 4仍然无法轻松禁用资产记录。
汤姆·罗西

1
我正在使用Rails 4.2,将其放在我的中development.rb,它禁用了资产记录。
2015年

12

我知道这是一个丑陋且临时的解决方案,但我使用以下方法:

尾-f log / development.log | grep -vE'资产'


9
这是一种改进的方法,也可以删除空白行:tail -f log/development.log | grep -vE "(^\s*$|asset)"
istvanp 2011年

12

许多人对的使用感到困惑config.assets.logger = false。这是它的作用和不作用的作用。

根据原始文件

设置config.assets.logger为false将关闭服务资产记录。

但是,这可能不是您认为的那样。它仅禁用链轮“服务”日志,而不禁用 Ruby on Rails actionpack请求日志。Ruby on Rails维护者在这里清楚地解释了这一点:https : //github.com/rails/rails/issues/4569#issuecomment-3594500


以链接为例,禁用了这样的日志:

投放的资产/jquery.isotope.js-304未修改(0ms)

但是这样的日志不是

在2012年1月20日23:16:46 -0500为127.0.0.1启动GET“ /assets/jquery.isotope.js?body=1”



7

采用:

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

这与choonkeat添加的代码相同。我只是将其包括在Windows下。


7

config / environments中的development.rb文件中,您将找到line 。config.assets.debug = true

切换到false,大部分资产负载输出将消失。在我的系统上,仅剩下两个对application.css和.js的请求。


3
设置为true时,该设置仅允许您将样式表和javascript拆分为单独的文件,以便于调试。设置为false(默认值)时,将它们全部捆绑到一个大文件中。因此,确实确实会减少调试输出,但是例如,如果您有映像,则这些映像完全不会受到影响。官方指南信息在这里
istvanp 2011年

1
我知道了。感谢您清理。但是我没有更改此变量的设置,因此我的默认值为true
TKAB 2011年


2

赢得胜利的日志 -可以立即消除 Ruby on Rails烦人的记录器默认设置(例如,记录资产,记录部分渲染),并且如果要添加/删除特定项目,则可以自定义。


0

前面提到的链接解决方案有助于:

https://github.com/evrone/quiet_assets

同样如下,它对我来说很好:

3.1(仅)(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

-1

在配置/环境中,添加config.log_level = :error到要更改的.rb文件。这会将日志设置更改为仅错误。


不幸的是没有,因为我主要使用日志来查看处于调试级别的请求和SQL数据。资产消息具有信息级别(低于调试级别),因此使用该设置获取我想要的信息是没有用的。
istvanp 2011年

2
这不是一个好主意。它会隐藏您可能仍想记录的其他信息级别的消息。
ifightcrime 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.