我的Web应用程序在multpile apache实例上运行,因此,我遇到了多进程日志记录问题。我目前正在使用SocketHandler通过SocketServer登录到守护程序,然后将日志写入单个日志文件(similar to this example)。
现在,我正在使用SocketHandler进行日志记录,因此我很难确定套接字服务器是否崩溃。例如,如果我尝试为没有监听套接字服务器的端口创建SocketHandler,则不会出现异常。我想捕获这种类型的错误并将其记录到文件中。
我的问题是,使用SocketHandler进行记录时,如何发现当前未在监听所使用的套接字?

最佳答案

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

  • 子类SocketHandler,重写createSocket方法并处理实现中的异常。
  • 请注意,如果尚未创建套接字,则sock实例的SocketHandler属性将为None。如果在记录事件后该值为None,则很可能SocketHandler不会发送它。
  • 注意,处理程序的makeSocket方法用于实际创建和连接套接字。因此,您可以在记录任何内容之前自己调用makeSocket,如果它引发异常,则说明您的服务器可能没有监听。如果返回成功,则可以关闭返回值。
  • 子类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
    

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

    关于python - 在Python中使用SocketHandler记录时捕获错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2220159/

    10-10 03:03