3

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

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

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

4

2 回答 2

4

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

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

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

于 2010-02-08T08:40:17.610 回答
1

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

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

于 2010-02-08T08:15:28.703 回答