我的Web应用程序在多堆apache实例上运行,因此我遇到了多进程日志记录问题。我目前正在使用SocketHandler使用SocketServer登录到守护程序,然后将日志写入单个日志文件(similar to this example)。
现在我正在使用SocketHandler进行日志记录,但是在发现套接字服务器是否/何时崩溃时遇到了问题。例如,如果我尝试为没有侦听套接字服务器的端口创建SocketHandler,则不会出现异常。我想捕获这种类型的错误并将其记录到文件中。
我的问题是,当使用SocketHandler进行日志记录时,如何才能发现当前正在收听正在使用的套接字?
答案 0 :(得分:3)
当套接字创建操作失败时(例如,因为没有服务器侦听),默认行为是在下次记录事件时使用指数退避算法重试。以下是您可以尝试的一些方法:
SocketHandler
,覆盖createSocket
方法并处理您在实施过程中的例外情况。sock
实例的SocketHandler
属性将为None
。如果在记录事件后值为None
,则很可能SocketHandler不会发送它。makeSocket
方法用于实际创建和连接套接字。因此,您可以在记录任何内容之前自己调用makeSocket
,如果它抛出异常,您就知道您的服务器可能没有正在侦听。如果它返回成功,那么您只需关闭返回的值。子类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
当然,如果服务器在发送邮件时发生故障,可能无法发现任何错误,但它至少应该提醒您服务器出现问题。
答案 1 :(得分:1)
目前的弹性实施无法做到这一点。 “弹性”意味着在这种情况下SocketHandler
将通过在出现问题时尝试重新打开套接字来处理套接字问题。
只需重新启动服务器,处理程序最终会重新连接。