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

378

在Ruby on Rails 3.1 (RC1)中,默认情况下Sprockets倾向于在(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.rbdevelopment.rb 中添加配置行,类似于 config.active_record.logger = nil,可以以干净的方式禁用或减少日志记录的冗长程度,就像静音 ActiveRecord SQL 语句一样。


有人报告了一个关于此问题的 bug:#2639。截至 9/2,仍处于“开放”状态。 - istvanp
14
这个问题的被接受答案应该被更改或更新。在Rails 3.2中,你只需要在development.rb中加入config.assets.debug = false即可。 - Stewart Johnson
7
@StewartJohnson - config.assets.debug = false 会将资产合并到一个文件中,这不是大多数开发人员想要的。 - Yarin
14个回答

381

将以下代码放入 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,现在我们改为使用根 rack 的 call

更新:@macournoyer 提供了一个恰当的 Rack 中间件解决方案(而不是脆弱的 alias_method_chain),链接为:https://github.com/rails/rails/issues/2639#issuecomment-6591735


3
从Rails 3.2.1开始,仅凭那些拉取请求并不能消除Sprocket日志记录,需要choonkeat的文件来实现。 - IAmNaN
5
确实。听起来这个文件将会一直被需要,因为将config.assets.logger设置为false只会让 Sprockets 输出变得安静。这将使 Action Pack 的请求/响应变得安静,而这是 Rails 开发人员已经表示不打算在特殊情况下安静的内容。 - Ben Kreeger
33
嗯,你应该把这个加入到Rails核心中。在config.assets中设置一个选项。 - jsharpe
2
在Windows中,将'/dev/null'替换为'NUL'。 - Matt
4
在Rails 4.2.0版本上对我有效。 - hsym
显示剩余12条评论

189

6
做得很好,但很遗憾需要使用一个单独的 gem 来实现这个功能。 - Adam Spiers
1
我认为Jose Valim在这里做出了正确的决定 https://github.com/rails/rails/issues/2639 Rails必须记录所有传入请求,我同意这一点,我认为当sprockets支持源映射时,我们可以摆脱这种开销 https://github.com/sstephenson/sprockets/issues/310 - route
5
对于懒人:gem 'quiet_assets'(请将其添加到帖子中 :)) - reto

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
4
对我来说,Rails 4.0.4的config.assets.logger = nil并没有起作用。 - hendrikbeck

28

只需要两件事:

  1. config/environments/development.rb 中设置 config.assets.debug = false
  2. rake assets:precompile。请参考@oma下面的评论;这不是必需的

就是这些!


19
  1. 没错。
- oma
虽然在最初提问的时候可能无法正常工作,但现在它可以工作了(正如@Race所述,已经在3.2.3中实现),因此现在应该被接受为正确答案。 - radiospiel
2
正如下面的istvanp所指出的那样,它并不会做你想要的事情。它只是将所有JS和CSS资源编译成一个大文件 - 它并没有关闭资产记录。 - davidgoli
2
这就是Rails 4.2.2所需的全部。 - thisfeller
补充@davidgoli所说的:config.assets.debug控制资产串联。关闭它意味着使用浏览器调试JS和CSS将变得更加困难。类似quiet_assets的东西可以消除日志记录,而不会导致您必须切换assets.debug以进行调试。 - johncip

27

最终,它将是 config.assets.logger = nil,但该部分目前在主分支中被存根(尚未完成)。


5
在Rails 3.1.3上对我也不起作用。@nessur:你确定它对你起作用吗?正如Tim所说,#2639仍然未解决,在那个问题中我没有看到任何修复的迹象(参考的两个拉取请求都被拒绝)。 - Adam Spiers
这个阶段不会实现。https://github.com/rails/rails/issues/4569 - 23inhouse
@AdamSpiers 根据链接:https://github.com/rails/rails/pull/3795#issuecomment-3549669"Rails不会特别处理任何记录器或记录器相关的中间件,以不记录特定路由" - 23inhouse
@23inhouse 我已经看到了,但正如我之前所说的那样,这只是一个意图的陈述,并不是对该意图的证明。 - Adam Spiers
3
糟糕,Rails 4 仍然无法轻松禁用资产日志记录。 - Tom Rossi
1
我正在使用Rails 4.2,在我的development.rb中添加了这个代码,它禁用了资产的日志记录。 - Jack

12

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

根据源文件文档

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

但这可能并不是你想象中的那样。它只禁用了Sprocket“serving”日志,而不是Ruby on Rails ActionPack请求日志。 Ruby on Rails维护者在此清晰地解释了这一点: https://github.com/rails/rails/issues/4569#issuecomment-3594500


从链接中获取的例子,像这样的日志被禁用:

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

但像这样的日志则不会被禁用:

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


12

我知道这并不是一个美观的、长久有效的解决方案,但我使用以下命令:

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


9
这是一个改进后的命令,它能够去除空行: tail -f log/development.log | grep -vE "(^\s*$|asset)" - istvanp

10
config.assets.quiet = true

这是最新的走法。


在Rails 5中完美运行。只需将其转储到development.rb中即可。 - Andreykul
与调试结合使用,无法满足我在Rails 5中的所有需求。 - Pysis

7
config/environments目录下的development.rb文件中,您会找到以下代码:config.assets.debug = true
将其改为false,大部分资源加载输出将消失。在我的系统上仅剩下对application.css和.js的两个请求。

3
如果设置为 true,该设置仅允许将样式表和 JavaScript 拆分成单独的文件以便更容易调试。如果设置为 false(默认值),它们将被捆绑成一个大文件。因此它确实减少了调试输出,但是如果您有图像等其他文件,则不会受到影响。官方指南信息在这里 - istvanp
1
我明白了,谢谢你澄清。但是我没有改变这个变量的设置,所以我的默认值是“true”。 - TKAB

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下也能工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接