【问题标题】:Automatically Logging Exceptions in Ruby在 Ruby 中自动记录异常
【发布时间】:2010-10-20 10:49:18
【问题描述】:

是否有一个库或简单的方法来捕获 Ruby 程序中抛出的异常并将其记录到文件中?我查看了log4rlogger,但两者的文档都没有提供任何关于我将如何执行此操作的示例。如果这些信息有帮助的话,我会远程运行这个程序并丢失 stdout 和 stderr 的句柄。

你会推荐什么?

【问题讨论】:

    标签: ruby logging exception-handling


    【解决方案1】:

    如果你想在野外散步,试试这个:

    class Exception
      alias real_init initialize
      def initialize(*args)
        real_init *args
        # log the error (self) or its args here
      end
    end
    

    这将在创建新异常对象时拦截创建。

    【讨论】:

    • 这个“有效”,但似乎以某种方式破坏了 Rails 4.x 启动(自动加载?)。
    【解决方案2】:

    Exception 中营救。这样的事情可能是有道理的:

    begin
      # run your code here ..
    rescue Exception => exception
      # logger.error(...) ....
      raise exception
    end
    

    这将记录异常,并重新引发它,以便应用程序在记录之外实际引发错误。

    exceptionException 的一个实例,请查看the docs 了解您可以使用此对象做什么(例如访问回溯)。

    【讨论】:

    • 嗯,这就是我害怕不得不做的事情。涉及的代码基本上是一个类,其中包含许多方法;我只需要在每种方法上都添加一个开始/救援还是有更简单的方法?
    • 您可能正在某处创建实例——将救援块放在您创建实例的位置。
    • 把它放在实例创建代码上不会有任何好处,除非错误是在创建中。如果您想在全局范围内捕获任何错误,请包装您的主体。
    • 我不是说把它放在“initialize”方法中,而是放在你调用“.new”的代码部分。
    • 啊,是的,这似乎也可以。我有点担心我必须在我与这个类交互的任何地方都这样做(因为它是通过网络完成的),而猴子补丁虽然有点粗略,但可以很好地完成工作。 +1 的帮助,再次感谢!
    【解决方案3】:

    如果您正在运行 Rails 应用程序,Exception Notification 插件非常方便。

    【讨论】:

    • 啊,是的,我确实见过,但我的应用程序不是 Rails 应用程序。不过谢谢!
    【解决方案4】:

    如果我做这样的事情会起作用吗:

    begin
      main()
    rescue Exception => e
      myCustomErrorLogger(e)
    end
    
    def main()
      # All the application code comes here.
    end
    

    我需要将所有未捕获的异常移到最顶层,并在那里被捕获并随后由错误日志记录功能记录。

    我现在正在尝试,但如果有您的建议会很棒。

    【讨论】:

      【解决方案5】:

      您可以在将原因和回溯放入标准输出的部分中调整 Exception 类的代码。

      不要忘记检查记录器是否可以为空,异常可以在记录器创建之前(或同时)抛出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多