【问题标题】:How do I log the entire trace back of a Ruby exception using the default Rails logger?如何使用默认的 Rails 记录器记录 Ruby 异常的整个回溯?
【发布时间】:2010-09-18 17:04:17
【问题描述】:

我正在研究 rails 项目,我正在尝试将异常记录到 rails 日志文件。我知道我可以调用logger.error $! 将异常的第一行记录到文件中。但是,我也想记录整个跟踪堆栈。如何使用默认的 Rails 记录器记录异常的整个回溯?

【问题讨论】:

    标签: ruby-on-rails ruby logging


    【解决方案1】:
    logger.error $!.backtrace
    

    还有,别忘了你可以

    rescue ErrorType => error_name
    

    为您的错误提供一个不同于默认 $! 的变量名称。

    【讨论】:

    • 我错过了什么吗? logger.error 只接受一个参数,因此代码不起作用...
    • 这个不行,改用logger.error e.message + "\n " + e.backtrace.join("\n ")
    • 我可以发誓 4 年前的多个参数有效,但也许它没有。我已将其更新为仅记录回溯,这似乎是问题最相关的方面;我相信读者可以发现多个记录器调用是可能的,字符串连接(或更多 Ruby-y,插值)也是如此。
    • 不要加入('\n')单引号:p
    【解决方案2】:

    rails 的做法是

    137             logger.fatal(
    138               "\n\n#{exception.class} (#{exception.message}):\n    " +
    139               clean_backtrace(exception).join("\n    ") +
    140               "\n\n"
    141             )
    
    248       def clean_backtrace(exception)
    249         if backtrace = exception.backtrace
    250           if defined?(RAILS_ROOT)
    251             backtrace.map { |line| line.sub RAILS_ROOT, '' }
    252           else
    253             backtrace
    254           end
    255         end
    256       end
    

    【讨论】:

      【解决方案3】:

      在更高版本的 Rails 中,只需取消注释 RAIL_ROOT/config/initializers/backtrace_silencers.rb 中的以下行(如果该文件不存在,则自行添加):

      # Rails.backtrace_cleaner.remove_silencers!
      

      通过这种方式,您可以在异常情况下将完整的回溯写入日志。这在 v2.3.4 中适用于我。

      【讨论】:

      【解决方案4】:

      logger.error caller.join("\n") 应该可以解决问题。

      【讨论】:

        【解决方案5】:

        在 Rails 中,ActionController::Rescue 处理它。在我的应用程序控制器操作中,我使用此模块中的方法 log_error 在日志中进行漂亮格式的回溯:

        def foo_action
          # break something in here
        rescue
          log_error($!)
          # call firemen
        end
        

        【讨论】:

          【解决方案6】:

          我会这样做:

          http://gist.github.com/127708

          这是 Exception#backtrace 的 ri 文档:

          http://gist.github.com/127710

          请注意,您也可以使用 Kernel#caller,它也可以为您提供完整的跟踪(减去当前帧)。

          http://gist.github.com/127709

          另外 - 请注意,如果您试图捕获 所有 异常,您应该从 Exception 中拯救,而不是 RuntimeError。

          【讨论】:

            【解决方案7】:

            你也可以使用 ruby​​ 的默认变量,像这样:

            logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
            

            【讨论】:

              猜你喜欢
              • 2010-12-03
              • 1970-01-01
              • 2014-09-11
              • 2011-03-29
              • 1970-01-01
              • 2011-06-17
              • 1970-01-01
              • 2019-01-29
              • 2013-09-01
              相关资源
              最近更新 更多