如何在 Ruby on Rails 中基于每个操作禁用日志记录?
我有一个 Rails 应用程序,该应用程序的某个操作被频繁调用,这在我开发时很不方便,因为它会导致大量我不关心的额外日志输出。我如何才能让 Rails 不记录这一操作的任何内容(控制器、操作、参数、完成时间等)?我也想在 RAILS_ENV 上对其进行条件化,以便生产中的日志完整。
谢谢!
I have a Rails application that has an action invoked frequently enough to be inconvenient when I am developing, as it results in a lot of extra log output I don't care about. How can I get rails not to log anything (controller, action, parameters, completion time, etc.) for just this one action? I'd like to conditionalize it on RAILS_ENV as well, so logs in production are complete.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
您可以使 Rails 记录器对象静音:
You can silence the Rails logger object:
使用
lograge
gem。Gemfile:
config/application.rb:
Use
lograge
gem.Gemfile:
config/application.rb:
以下至少适用于 Rails 3.1.0:
制作一个可以静音的自定义记录器:
告诉 Rails 使用它:
上面的示例显示了静音资产服务请求,这在开发环境中意味着更少(有时甚至没有)向后滚动需要查看实际请求。
The following works with at least Rails 3.1.0:
Make a custom logger that can be silenced:
Tell Rails to use it:
The example above shows silencing asset serving requests, which in the development environment means less ( and sometimes no) scrolling back is required to see the actual request.
答案比我预想的要困难得多,因为 Rails 确实没有提供任何钩子来做到这一点。相反,您需要包装 ActionController::Base 的一些内容。在我的控制器的公共基类中,我
在控制器中使用我想要禁止登录的方法:
The answer turns out to be a lot harder than I expected, since rails really does provide no hook to do this. Instead, you need to wrap some of the guts of ActionController::Base. In the common base class for my controllers, I do
then, in the controller with the method I want to suppress logging on:
您可以将 gem 添加到 Gemfile silencer。
在你的 config/initializers/silencer.rb 中:
You can add the gem to the Gemfile silencer.
And in your config/initializers/silencer.rb :
以下适用于 Rails 2.3.14:
制作一个可以静默的自定义记录器:
告诉 Rails 使用它:
在每个操作开始时拦截日志输出,并根据操作是否应该静默或(重新)配置记录器不是:
The following works with Rails 2.3.14:
Make a custom logger that can be silenced:
Tell Rails to use it:
Intercept the log output at the beginning of each action and (re)configure the logger depending on whether the action should be silent or not:
在 Rails 5 中,请求处理变得更加复杂,并记录在多个类中。首先我们需要重写
Logger
类中的call_app
,让我们调用这个文件lib/logger.rb
:然后是
lib/silent_log_subscriber .rb
:确保在加载
rails
后加载修改后的模块,例如在config/application.rb
中:最后配置排除的路径:
当我们修改核心代码时对于 Rails 来说,检查您正在使用的 Rails 版本中的原始类总是一个好主意。
如果这看起来修改太多,您可以简单地使用
lograge
gem与其他一些修改几乎相同。虽然 Rack::Loggger 自 Rails 3 以来代码已发生更改,因此您可能会失去一些功能。With Rails 5 it gets more complicated request processing is logged in several classes. Firstly we need to override
call_app
inLogger
class, let's call this filelib/logger.rb
:Then follow with
lib/silent_log_subscriber.rb
:Make sure to load modified modules e.g. in
config/application.rb
after loadingrails
:Finally configure excluded paths:
As we're modifying core code of Rails it's always good idea to check original classes in Rails version you're using.
If this looks like too many modifications, you can simply use
lograge
gem which does pretty much the same with few other modifications. Although theRack::Loggger
code has changed since Rails 3, so you might be loosing some functionality.@neil-stockbridge 的答案不适用于 Rails 6.0,我编辑了一些以使其工作
测试 Rails 应用程序以使用它:
@neil-stockbridge 's answer not worked for Rails 6.0, I edit some to make it work
Test rails app to use it:
Sprockets-rails gem 从
3.1.0
版本开始引入了以下实现安静资产。不幸的是,目前它还不灵活,但可以很容易地扩展。创建 config/initializers/custom_quiet_assets.rb 文件:
将其添加到 config/application.rb 中的中间件:
使用 Rails 4.2 进行测试
Sprockets-rails gem starting from version
3.1.0
introduces implementation of quiet assets. Unfortunately it's not flexible at this moment, but can be extended easy enough.Create
config/initializers/custom_quiet_assets.rb
file:Add it to middleware in
config/application.rb
:Tested with Rails 4.2
Rails 6。我必须将其放入应用程序的类定义中的 config/application.rb 中:
这会使 log_tags 配置保持不变,并在中间件冻结之前对其进行修改。我想把它放在
config/initializers/
某个隐藏的地方,但还没有弄清楚如何做到这一点。Rails 6. I had to put this in
config/application.rb
, inside my app's class definition:That leaves the
log_tags
config intact and modifies the middleware before it gets frozen. I would like to put it inconfig/initializers/
somewhere tucked away but haven't figured out how to do that yet.