使用Python中的SocketHandler进行日志记录时捕获错误

时间:2010-02-08 07:40:02

标签: python sockets exception-handling mod-python

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 子类SocketHandler,覆盖createSocket方法并处理您在实施过程中的例外情况。
  2. 请注意,如果尚未创建套接字,sock实例的SocketHandler属性将为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
    
  5. 当然,如果服务器在发送邮件时发生故障,可能无法发现任何错误,但它至少应该提醒您服务器出现问题。

答案 1 :(得分:1)

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

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