我正在使用 Rails 应用程序。每当出现错误时,我都可以在生产服务器中看到以下屏幕。(文字:我们很抱歉,但出了点问题。)
如何在我的服务器中启用错误报告以查看实际错误?我是否必须在 Rails 应用程序中进行任何配置更改或在我的服务器中启用错误报告。
注意:我的服务器是 Ngnix。
我正在使用 Rails 应用程序。每当出现错误时,我都可以在生产服务器中看到以下屏幕。(文字:我们很抱歉,但出了点问题。)
如何在我的服务器中启用错误报告以查看实际错误?我是否必须在 Rails 应用程序中进行任何配置更改或在我的服务器中启用错误报告。
注意:我的服务器是 Ngnix。
如果您将此添加到您的config/environments/production.rb
:
config.consider_all_requests_local = true
您将看到与开发中相同的错误,但它也会禁用生产应用程序的缓存等。
我宁愿建议你调查一下/log/production.log
。与通常在屏幕上显示的错误相同。
对于错误报告,有一个名为exception_notification的便捷 gem ,每次应用程序中发生异常时都会向您发送一封邮件。
如果您还想在页面上获得详细且完全可定制的错误报告,则必须进行一些编码。这是我使用的(我会给你一个链接,指向我从哪里获取它,但我再也找不到它了:()
定义一个ErrorsController
这样的:
class ErrorsController < ApplicationController
ERRORS = [
:internal_server_error,
:not_found,
:unprocessable_entity,
:unauthorized
].freeze
ERRORS.each do |e|
define_method e do
respond_to do |format|
format.html { render e, :status => e }
format.any { head e }
end
end
end
结尾
创建一个初始化器将控制器挂接到 Rails 异常处理链中:
require 'action_dispatch/middleware/show_exceptions'
module ActionDispatch
class ShowExceptions
private
def render_exception_with_template(env, exception)
env['exception'] = exception
body = ErrorsController.action(rescue_responses[exception.class.name]).call(env)
log_error(exception)
env.delete 'exception'
body
rescue Exception => e
log_error(e)
render_exception_without_template(env, exception)
end
alias_method_chain :render_exception, :template
end
end
为每个错误创建一个视图ErrorsController::ERRORS
(即 app/views/errors/not_found.html.erb 等)。
我不认为这是最好的技术,但到目前为止它对我很有帮助(您可以轻松地为新错误添加页面,自定义您希望分别为每个错误显示的方式和内容)。