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

Posted

技术标签:

【中文标题】如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?【英文标题】:How can I disable logging of asset pipeline (sprockets) messages in Ruby on Rails 3.1? 【发布时间】:2011-09-12 20:04:53 【问题描述】:

在 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 语句静音。

【问题讨论】:

有人报告了一个关于此的错误:#2639。截至 9 月 2 日仍然“开放”。 应更改或更新此问题的已接受答案。在 Rails 3.2 中,您只需将 config.assets.debug = false 放入您的 development.rb。 @StewartJohnson - config.assets.debug = false 将资产连接到一个文件中——这不是大多数人在开发中想要的 【参考方案1】:

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

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

【讨论】:

从 Rails 3.2.1 开始,这些单独的 pull 不会抑制 sprocket 日志记录,并且仍然需要 choonkeat 的文件。 确实如此。听起来总是需要这个文件,因为将 config.assets.logger 设置为 false 只会使 Sprockets 输出的内容静音。这会使 Action Pack 请求/响应静音,这是 Rails 开发人员 have said they don't intend to silence for special cases. 嗯。你应该把它放到rails核心中。使其成为 config.assets 中的一个选项 在 Windows 上将 '/dev/null' 替换为 'NUL' 在 Rails 4.2.0 上为我工作【参考方案2】:

查看https://github.com/evrone/quiet_assets 并将其包含到您的 Gem 文件中。

懒人:gem 'quiet_assets', group: :development

【讨论】:

伟大的工作,但很遗憾为此需要单独的宝石。 我认为 Jose Valim 在这里做出了正确的决定 github.com/rails/rails/issues/2639 rails 必须记录所有传入的请求,我同意这一点,我认为当 sprockets 将支持源映射 github.com/sstephenson/sprockets/issues/310 时我们可以摆脱这种开销 懒人:gem 'quiet_assets'(请在帖子中添加这个:))【参考方案3】:

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

【讨论】:

按预期在 Raise 4 中工作。需要重新启动服务器才能使其正常工作。 Rails 4.0.2 config.assets.logger = nil 为我工作 Rails 4.0.4 config.assets.logger = nil 不适合我【参考方案4】:

两件事就足够了:

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

就是这样!

【讨论】:

1.是正确的。谢谢!请删除 No 2。rake assets:precompile 不是我们在开发中想要做的事情 虽然在发布原始问题时这可能不起作用,但它现在可以工作(并且,正如@Race 所说,已经有了 3.2.3)并且现在应该接受答案。 正如 istvanp 在下面指出的那样,这并不像您认为的那样。它只会将所有 JS 和 CSS 资产编译成一个大文件 - 它不会关闭资产日志记录。 这就是 rails 4.2.2 所需要的全部 补充@davidgoli 所说的:config.assets.debug 控制资产连接。关闭它意味着调试例如使用浏览器的 JS 和 CSS 将变得更加工作。像 quiet_assets 这样的东西会抑制日志记录,而不会导致您必须将 assets.debug 切换到调试。【参考方案5】:

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

【讨论】:

在 Rails 3.1.3 上对我也不起作用。 @nessur:你确定它适合你吗?正如蒂姆所说,#2639 仍然开放,我在该问题中没有看到任何修复的迹象(引用的两个拉取请求都被拒绝)。 此阶段不会实施。 github.com/rails/rails/issues/4569 @AdamSpiers 根据链接:github.com/rails/rails/pull/3795#issuecomment-3549669“Rails 不会特殊情况下任何记录器或记录器相关中间件不记录特定路由” 无赖。 Rails 4 仍然无法轻松禁用资产日志记录。 我使用的是 Rails 4.2,把它放在我的 development.rb 中,它禁用了资产记录。【参考方案6】:

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

tail -f 日志/development.log | grep -vE '资产'

【讨论】:

这是一个改进的删除空行的方法:tail -f log/development.log | grep -vE "(^\s*$|asset)"【参考方案7】:

很多人对config.assets.logger = false 的使用感到困惑。这是它做什么和不做什么。

根据source documentation:

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

然而,这可能不是你想象的那样。 它只禁用 sprocket 'serving' 日志,而不是 Ruby on Rails actionpack 请求日志。 Ruby on Rails 维护者在这里清楚地解释了这一点: https://github.com/rails/rails/issues/4569#issuecomment-3594500


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

服务资产 /jquery.isotope.js - 304 未修改 (0ms)

但是这样的日志不是

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

【讨论】:

【参考方案8】:
config.assets.quiet = true

这是最新的方法。

【讨论】:

在 Rails 5 中完美运行。只需将其转储到 development.rb 加上调试,并不能解决我在 Rails 5 中的所有需求。【参考方案9】:

用途:

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 added。我只是将它包含在 Windows 下也可以工作。

【讨论】:

【参考方案10】:

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

将其切换为false,大部分资产负载输出将消失。在我的系统上,只有 application.css 和 .js 这两个请求仍然存在。

【讨论】:

该设置仅允许您在设置为 true 时将样式表和 javascript 拆分为单独的文件,以便于调试。当设置为 false(默认值)时,它将它们全部捆绑到一个大文件中。所以它确实减少了调试输出,但是如果你有图像,那么它们根本不会受到影响。官方指南信息here. 我明白了。感谢您清除它。但是我没有改变这个变量的设置,所以我的默认是true【参考方案11】:

在文件config/environments/development.rb请添加:

config.assets.debug = false

config.assets.logger = false

【讨论】:

【参考方案12】:

Lograge 赢得胜利 - 它消除了 Ruby on Rails 恼人的记录器默认设置(例如记录资产、记录部分渲染),并且如果您想添加/删除特定项目,它是可自定义的。

【讨论】:

【参考方案13】:

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

https://github.com/evrone/quiet_assets

如下所示,它对我来说工作正常:

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

【讨论】:

【参考方案14】:

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

【讨论】:

很遗憾没有,因为我主要使用日志来查看处于调试级别的请求和 SQL 数据。资产消息属于信息级别(低于调试级别),因此使用该设置获取我想要的内容是没有用的。 这不是一个好主意。它将隐藏您可能仍希望记录的其他信息级别消息。

以上是关于如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 ruby​​ on rails 作业进行测试

Ruby On Rails 3.1 中的尾随日志文件

mass_assignment_authorizer 的更改导致 Ruby on Rails 3.1 中的错误

替换 Ruby on Rails 3.1 中的“auto_link”方法

Ruby on Rails:RSpec 和 Acts As Audited(在测试时禁用acts_as_audited?)

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?