【问题标题】:Catching errors when logging with SocketHandler in Python在 Python 中使用 SocketHandler 记录时捕获错误
【发布时间】:2010-02-08 07:40:01
【问题描述】:

我的 Web 应用程序在多个 apache 实例上运行,因此我遇到了多进程日志记录问题。我目前正在使用 SocketHandler 记录到使用 SocketServer 的守护程序,然后将日志写入单个日志文件 (similar to this example)。

现在我使用 SocketHandler 进行日志记录,我无法发现套接字服务器是否/何时崩溃。例如,如果我尝试为没有侦听套接字服务器的端口创建 SocketHandler,则不会出现异常。我想捕获此类错误并将其记录到文件中。

我的问题是,当使用 SocketHandler 进行日志记录时,我如何才能发现正在使用的套接字当前没有被监听?

【问题讨论】:

    标签: python sockets exception-handling mod-python


    【解决方案1】:

    当套接字创建操作失败时(例如,因为没有服务器监听),默认行为是在下次记录事件时重试,使用指数退避算法。以下是您可以尝试的一些方法:

    1. 子类SocketHandler,覆盖createSocket 方法并按照您在实现中的方式处理异常。
    2. 请注意,如果尚未创建套接字,SocketHandler 实例的sock 属性将为None。如果在您记录事件后该值为 None,则 SocketHandler 很可能不会发送它。
    3. 请注意,处理程序的makeSocket 方法用于实际创建和连接套接字。因此,您可以在记录任何内容之前自己调用makeSocket,如果它引发异常,您就知道您的服务器可能没有在监听。如果返回成功,那么你可以关闭返回的值。
    4. 子类SocketHandler,覆盖emit 方法,并在您的子类中,引用您要使用的备用处理程序实例(例如FileHandlerSMTPHandler)。在您的emit 代码中,尝试使用

      创建套接字
      if self.sock is None:
          self.createSocket()
      if self.sock is None:
          # creation failed: do self.alternate_handler.handle(record)
      else:
          # creation succeeded: defer to superclass implementation
      

    当然,如果服务器在发送消息的过程中出现故障,这可能不会捕获任何发生的错误,但它至少应该提醒您服务器的一些问题。

    【讨论】:

    • 到目前为止,方法 4 似乎对我有用。 :) 我并不担心捕获所有错误,而是知道套接字是否似乎完全失败了。
    【解决方案2】:

    目前的弹性实现无法做到这一点。在这种情况下,“弹性”意味着SocketHandler 将通过在出现问题时立即尝试重新打开套接字来处理套接字问题。

    只需重新启动服务器,处理程序最终将重新连接。

    【讨论】:

    • 如果日志静默,我如何知道何时重启服务器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多