Tre*_*ner 4 python sockets mod-python exception
我的 Web 应用程序在多个 apache 实例上运行,因此我遇到了多进程日志记录问题。我目前正在使用 SocketHandler 来使用 SocketServer 记录到守护程序,然后将日志写入单个日志文件(类似于此示例)。
现在我正在使用 SocketHandler 进行日志记录,我无法发现套接字服务器是否/何时崩溃。例如,如果我尝试为没有侦听套接字服务器的端口创建 SocketHandler,则不会出现异常。我想捕获这种类型的错误并将其记录到文件中。
我的问题是,当使用 SocketHandler 进行日志记录时,如何发现正在使用的套接字当前未被监听?
当套接字创建操作失败时(例如,因为没有服务器侦听),默认行为是在下次记录事件时使用指数退避算法重试。您可以尝试以下一些方法:
SocketHandler,重写createSocket方法并按照您在实现中的方式处理异常。sock的属性SocketHandler将为。None如果该值是None在您记录事件之后,则 SocketHandler 很可能不会发送它。makeSocket处理程序的方法用于实际创建和连接套接字。因此,您可以makeSocket在记录任何内容之前调用自己,如果它抛出异常,您就知道您的服务器可能没有在监听。如果返回成功,那么你可以直接关闭返回值。Subclass SocketHandler,重写该emit方法,并在您的子类中引用您要使用的备用处理程序实例(例如FileHandler或)。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
Run Code Online (Sandbox Code Playgroud)当然,如果服务器在发送消息的过程中出现故障,这可能无法捕获发生的任何错误,但它至少应该提醒您服务器的一些问题。