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

7
我正在开发一个基于rails的应用程序。 在我的生产服务器上,每当出现错误时,我会看到以下屏幕。(文本:We're sorry, but something went wrong.)
如何在我的服务器上启用错误报告以查看实际错误? 我是否需要在Rails应用程序中进行任何配置更改或启用服务器上的错误报告。
注意: 我的服务器是Nginx。
2个回答

13

如果您将以下内容添加到config/environments/production.rb

config.consider_all_requests_local = true

在生产环境中,你将看到与开发环境中相同的错误,但它还会禁用生产应用程序的缓存等。

我建议你查看/log/production.log。在那里发布与通常显示在屏幕上相同的错误。


1

对于错误报告,有一个方便的宝石叫做exception_notification,每当应用程序发生异常时都会向您发送一封邮件。

如果您还想在页面上获得详细且完全可定制的错误报告,您需要进行一些编码。 这是我使用的代码(我会给您提供一个链接,但我找不到它了 :( )

  • 定义一个 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
    

    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 等)。

  • 我不认为这是最好的技术,但到目前为止它已经为我服务得很好了(你可以轻松地添加新错误页面,自定义每个错误的显示方式和内容)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接