导轨回溯消音器不起作用,而过滤器起作用

2023-11-21

新的 Rails 4.2 设置。我想抑制长错误回溯。在下面的回溯日志中,第一行对我来说就足够了,接下来的 4 行可以删除

ActionController::RoutingError (No route matches [GET] "/user"):
  actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.2) lib/web_console/middleware.rb:37:in `call'
  actionpack (4.2.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.1) lib/rails/rack/logger.rb:38:in `call_app'

我添加了一个新的消音器backtrace_silencers.rb

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_silencer { |line| line =~ /lib/ }

服务器重新启动后 - 没有任何反应,我仍然得到相同的回溯日志。 (每行匹配/lib/应该被删除:http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.htm)

完整性检查:

> line = "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
=> "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
> line =~ /lib/
=> 19

但过滤器有效:

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_filter { |line| line.gsub('lib', 'yeah!') }

现在回溯看起来像这样:

ActionController::RoutingError (No route matches [GET] "/user"):
  actionpack (4.2.1) yeah!/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.2) yeah!/web_console/middleware.rb:37:in `call'
  actionpack (4.2.1) yeah!/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.1) yeah!/rails/rack/logger.rb:38:in `call_app'

希望获得有关如何使消音器工作的建议。干杯!


这是因为https://github.com/vipulnsward/rails/blob/ecc8f283cfc1b002b5141c527a827e74b770f2f0/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L155-L156

Since application_trace为空(这是因为错误不是来自用户代码而是来自路由错误),我们正在回退到framework_trace,它不会过滤它(它只过滤噪音)。

您可以通过创建自己的 log_formatter 来实现您的目标。在你的development.rb and/or test.rb add

config.log_formatter = SilentLogger.new
config.log_formatter.add_silencer { |line| line =~ /lib/ }

并在模型中仅使用方法创建简单的类call必需的。在那里您可以根据需要修改回溯。

class SilentLogger
  def initialize
    @silencers = []
  end

  def add_silencer(&block)
    @silencers << block
  end

  def call(severity, timestamp, progname, msg)
    backtrace = (String === msg) ? "#{msg}\n" : "#{msg.inspect}\n"

    return backtrace if @silencers.empty?

    @silencers.each do |s|
      backtrace = backtrace.split("\n").delete_if { |line| s.call(line) }
    end

    backtrace.join("\n")
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导轨回溯消音器不起作用,而过滤器起作用 的相关文章

随机推荐

  • 通过 PHP 加载图像

    我正在尝试通过 PHP 加载图像 但我不知道如何 文件名存储在数据库中 例如image jpg if GET image Client requesting image so retrieve it from DB id mysql rea
  • 如何让 gcc 跳过错误,但仍然输出它们。

    是否可以强制 gcc 报告错误 但继续编译它们 本质上 我试图在 c 文件中生成错误列表 但 gcc 总是在出现第一个错误时终止 我已经在谷歌上搜索了一段时间 据我所知 这并不是一个明显需要解决的问题 当 GCC 无法继续前进时 它就会终止
  • NodeJS keydown/keyup 事件

    我有兴趣看看是否可以将功能绑定到用户按下 释放键盘上的按键 到目前为止 我已经能够通过以下方式获取按键事件keypress模块和process stdin的原始模式 var keypress require keypress keypres
  • 错误:应用程序:transformClassesWithDexBuilderForDebug

    我在这个包中有一个 HillfortStore 类 package org wit hillforts models 弄乱了类中的包名称 缺少 s package org wit hillforts model 将类导入到具有错误包名的其他
  • 为什么一些有经验的程序员在变量之前写与值的比较? [复制]

    这个问题在这里已经有答案了 可能的重复 如何检查是否相等 0 i 或 i 0 为什么在 C 中经常看到 null variable 而不是 variable null 我一直在查看一些奇怪的教程以及一些 DirectX 代码 并注意到许多经
  • 如何读取特定文件夹内的所有文件

    我想读取 c net 中特定文件夹内的所有 xml 文件 XDocument doc2 XDocument Load PG SMNR XMLDataSourceUtil GetXMLFilePath Locale Products cate
  • 从 CLOB(包含 XML)中提取特定值,同时为表的每一行创建一个分隔字符串。某些行上的 CLOB 值可能为空

    一些背景 数据库是Oracle 我正在尝试为表的每一行创建一个分隔字符串 分隔字符串的某些值必须来自 CLOB 包含 XML 某些行上的 CLOB 可能为空 这就是问题所在 例如 我有一个表 Item 其中包含以下行 Item ID Ite
  • 重新安装 Microsoft Visual Studio Asp.net MVC 5 脚手架扩展

    我在 Asp Net MVC 5 和 Visual studio 2013 中遇到脚手架问题 我尝试通过首先卸载扩展 Microsoft Visual Studio Asp net MVC 5 Scaffolding 来重新安装它 但我找不
  • AngularJS 和 Windows 8 路由错误

    我正在尝试使用 Visual Studio 2012 在 Windows 8 1 上使用 AngularJS 创建 HTML5 JS CSS3 应用程序 我目前坚持将参数发送到其他视图 当谷歌搜索时 我看到几个使用的例子 a href li
  • Matplotlib 子图 y 轴刻度与上面的图重叠

    我正在尝试绘制 3 个子图 它们之间没有任何空白 默认 y 轴刻度标签使用显示在 y 轴右上角的刻度 下例中的 1e 8 除了与上面的图重叠的下面两个图之外 这很好 有人知道怎么修这个东西吗 下面是一个小例子 import numpy as
  • Nodejs 7 的异步等待

    我已经安装了nodejs 7 3 0 并且有以下代码 let getContent function url return new pending promise return new Promise resolve reject gt s
  • 允许在录制视频时播放音乐,如 Snapchat ios

    首先我想讨论一下发生在snapchat 在 Snapchat 中 当您开始录制视频且歌曲在后台运行时 它允许在录制视频时继续播放该歌曲 录制视频后您还可以在背景中听到该歌曲 我在用SCR记录器用于使用我的自定义布局录制视频和捕获图像 现在我
  • git:如何将分支的根移回两次提交

    假设我有 A B C D E F master G H new feature branch 现在我意识到实际上提交了 B 和 C 属于新功能 所以我想将它们移动到 新功能分支 换句话说 我希望 新功能分支 从 A 开始 并包含提交 B 和
  • 如何在 C/C++ 中处理 unicode 字符序列?

    在 C 和 C 中处理 unicode 字符序列的更便携和简洁的方法是什么 此外 如何 读取unicode字符串 将 unicode 字符串转换为 ASCII 以节省一些字节 如果用户仅输入 ASCII 打印unicode字符串 我也应该使
  • 如何同时从列表中删除多个索引? [复制]

    这个问题在这里已经有答案了 假设我这里有这个列表 list a b c d e f g 我如何删除说索引2 3 4 and 5同时 pop 不接受多个值 我还能怎么做呢 您需要在循环中执行此操作 没有内置操作可以一次删除多个索引 您的示例实
  • 如何在android中实现onMenuItemClickListener

    我如何实施onMenuItemClickListener Override public boolean onCreateOptionsMenu Menu menu super onCreateOptionsMenu menu getMen
  • 如何创建重复的日历事件?

    我正在使用 asp mvc 3 jquery full calendar ms sql server 2008 和 c 我想知道是否有人知道如何制作重复事件 我不确定如何制作它们 例如 在谷歌日历中 您可以每年重复一次约会 我怀疑他们在数据
  • C# 3.0:自动属性 ​​- 编译器创建的私有变量的名称是什么

    我在检查 NET 3 5的新特性 发现在C 3 0中 我们可以使用 public class Person public string FirstName get set public string LastName get set 代替
  • jQuery select2 控件 - 检索最后选择的元素

    我正在使用 jQuery select2 控件 我需要实现以下功能 如果用户尝试添加某个元素 基于某种算法 我应该从选择中删除另一个 不兼容的 元素 我看到有两种方法可以实现这一目标 1 禁止对所选值进行自动排序 2 获取最后选择的项目的值
  • 导轨回溯消音器不起作用,而过滤器起作用

    新的 Rails 4 2 设置 我想抑制长错误回溯 在下面的回溯日志中 第一行对我来说就足够了 接下来的 4 行可以删除 ActionController RoutingError No route matches GET user act