Oh!Coder

Coding Life

Better_errors Gem简介

| Comments

今天跟大家分享的gem名叫Better Errors。Better Errors把Rails的标准错误输出页替换成一个更好看,更有帮助的页面。除了对Rails支持以外,对于任何遵循Rack标准的app以及Rack的中间件依然可用。

pic

图片来源:原文档配图

特性

  • 全栈追踪
  • 对全栈框架的源码进行检查(包括高亮显示)
  • 本地和实例变量检查
  • 在每一个栈中留守REPL

安装

在Gemfile中添加如下代码:

1
2
3
group :development do
  gem "better_errors"
end

如果你想使用Better Error的高级特性(REPL,本地/实例变量检查,漂亮的栈帧名称),那么你需要在Gemfile中添加binding_of_caller

1
gem "binding_of_caller"

这只是一个可选项,Better Errors如果没有这个也将会很好的工作。

注意:如果你发现Better Errors没有工作-特别是从版本0.5.0或更低的版本升级过来的-确保在config/environments/development.rb文件中设置config.consider_all_requests_local = true

安全

注意:把better_errors方法放到development环境本来就有些擦边球的意思。千万不要让better_errors跑在production环境,或直接在主机上直接面向internet。

你会发现只有在localhost上才能得到Better Errors的页面,这也就是说,如果你在做远程调试,那么你得到的只有远程主机的默认错误页面。很显然,你并不想向公众公开REPL,除此之外获取还有一些敏感的信息不能泄漏。

为了更加安全,可以在Rails的config/environments/development.rb文件中一行代码:

1
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']

然后Rails中运行如下命令:

1
TRUSTED_IP=66.68.96.220 rails s

这里注意allow_ip!其实被一个Set类型存储,所以你可以添加不止一个IP地址或子网。

Tip:你可以通过老的”Show env dump”错误页面找到IP,然后查看”REMOTE_ADDR”。

VritualBox:如果正在使用VirtualBox并且通过主机浏览器访问客户,你会需要通过allow_ip!来看到错误页面。

使用

如果你正在使用Rails,那么你不需要做任何额外的工作。

如果你没有正在使用Rails,那么你需要在你的中间件中插入BetterErrors::Middleware,可选项BetterErrors.application_root可以帮助你简化应用中的文件名。

这里给出一个在Sinatra中使用的例子:

1
2
3
4
5
6
7
8
9
10
11
require "sinatra"
require "better_errors"

configure :development do
  use BetterErrors::Middleware
  BetterErrors.application_root = __dir__
end

get "/" do
  raise "oops"
end

纯文本

当请求是XMLHttpRequestAccept头没有包括’html’的时候,Better Errors将会渲染文本页面。

Unicorn, Puma以及其他多worker的服务器

Better Errors的运行,需要在server的进程中开辟许多内存。如果你正在使用跑有多个”worker”的web服务,Better Errors就像是第二个访问请求,将会碰到不同的worker。这个worker不需要占用文本内存空间,你会看到Session Expired消息。

如果这里说的例子正符合你的情况,考虑在development环境下将worker的数量调整到(1)。如果此时你正在开发环境下查找问题,其他可供选择的方式为,可以使用WebrickMongrelThin或其他类似于rails server的单进程服务。

更多

更多,更新的内容可参见原文档

Comments