我一直在寻找正确的方法.我遇到了this个链接,上面说logger.error $!, $!.backtrace是一条路要走,但这对我不起作用,log_error是.根据文档,我不知道将第二个参数传递给error方法会如何工作,因为rails使用的ruby logger只接受一个参数.

奇怪的是(或许不是),第二个论点在没有任何口译员抱怨的情况下被接受了.然而,我传递给它的任何东西都被忽略了.

有人能解释我遗漏了什么吗?对错误的第二个论点是什么,以及它的成因有什么见解吗?

推荐答案

如果查看ActiveSupport中BufferedLogger类的源代码,就会发现第二个参数是"progname".只有当第一个参数为nil,并且没有为其指定块或块返回非真值时,才使用此选项.

本质上,您不能使用第二个参数来输出额外的内容.

你想做的事情更类似于:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

根据日志(log)设置的不同,最好遍历回溯的每一行并单独打印,因为某些记录器不会输出换行符,在这种情况下,您可以执行以下操作:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

Ruby-on-rails相关问答推荐

使用Hotwire/Turbo的Rails在链接悬停时获取请求

在控制器操作中适当使用ActiveModel Dirty

链轮轨道V4链接到外部Ruby 的 list 文件

如何在Rails中创建没有字符串的查询

关于关联 has_many 的多级/三重嵌套形式

nginx 中的 Rails 7 Active Storage - 图像中途停止加载 net::ERR_HTTP2_PROTOCOL_ERROR 200

为什么有时会出现类型错误没有将 StringIO 隐式转换为 String?Ruby /导轨

Ruby 3 动态关键字参数

您如何测试方法调用块内调用的方法,以及使用 rspec 在块内传递给该方法调用的内容

你如何发布到 Capybara 中的 URL?

使用 Rspec 测试 Rails 3.1 可安装引擎

为什么使用 HTTP PUT 和 DELETE 方法而不是 POST?

rspec 共享示例与共享上下文

在 rake 任务期间关闭观察者的简单方法?

验证一个对象是否有一个或多个关联对象

导轨链接到:远程

我可以在 Ubuntu 上使用 apt-get 安装 gems 吗?

如何打印出范围之间的随机数?

我怎样才能看到水豚在失败的黄瓜步骤中发现了什么?

您如何查看 ruby​​ 中的调用堆栈示例?