如何在生产模式下运行rails应用程序时启用错误报告?

时间:2012-07-25 12:22:11

标签: ruby-on-rails

我正在使用rails应用程序。 每当出现错误时,我都可以在生产服务器中看到下面的屏幕。 (文字:我们很抱歉,但出了点问题。)

如何在我的服务器中启用错误报告以查看实际错误? 我是否必须在Rails应用程序中进行任何配置更改或在我的服务器中启用错误报告。

enter image description here

注意:我的服务器是Ngnix。

2 个答案:

答案 0 :(得分:13)

如果您将其添加到config/environments/production.rb

config.consider_all_requests_local = true

您将看到与开发中相同的错误,但它也会禁用生产应用程序等的缓存。

我建议你调查一下/log/production.log。屏幕上通常会显示相同的错误。

答案 1 :(得分:1)

对于错误报告,有一个名为exception_notification的方便的gem,每次在您的应用程序中发生异常时都会向您发送邮件。

如果您还希望在页面上获得详细且完全可自定义的错误报告,则必须进行一些编码。 这是我使用的(我会给你一个链接到我从哪里拿到这个,但我找不到它了:()

  1. 像这样定义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
    

  2. 创建一个初始化程序,将控制器挂钩到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
    
  3. ErrorsController::ERRORS中的每个错误创建一个视图(例如app / views / errors / not_found.html.erb等)。

  4. 我并不认为这是最好的技术,但它到目前为止一直很好用(你可以轻松地为新错误添加页面,自定义每个错误的显示方式和内容)。