SocketHandler的客户端/服务器日志记录模块超时

时间:2013-11-03 15:35:05

标签: python logging

我使用logging实现python SocketHandler模块来记录来自多台远程计算机的消息。

客户端部分:

    ......

    if self.loggerHost == "localhost":
        self.loggerHost = socket.gethostname()
    .......

    self.logger = logging.getLogger(self.handleName)

    self.logger.setLevel(logging.DEBUG)

    numberOfHandles = len(self.logger.handlers)

    # are there no handles in the logger
    if numberOfHandles == 0:

        self.loggerPort = logging.handlers.DEFAULT_TCP_LOGGING_PORT

        self.socketHandler = logging.handlers.SocketHandler(self.loggerHost, self.loggerPort)

        self.logger.addHandler(self.socketHandler)

    ......

    # send the new handle to Handle table 
    self.__NewHandle(paramsDict=paramDict)

__NewHandle方法创建一个新日志:

def __NewHandle(self, paramsDict):

        .......

        # update logger with new log! (trace)
        self.logger.debug(xmlString)

服务器部分:

 while not self.abort:

     rd, wr, ex = select.select([self.socket.fileno()],
                                       [], [],
                                       self.timeout)

     # we have a read list available to read and process
     if rd:
         self.handle_request()

     .......

问题:

当服务器可用时,一切工作都很好,并且每个日志都记录得非常快〜0.1 [mS]但是当服务器不可用时,记录速度很慢,第一次记录可能需要1秒[秒]这对生产来说是不可接受的

我无法在python文档中找到任何attribute来控制日志记录的超时(客户端

因此,如果我使用logger.debug("...."),则不会花费太多时间。

是否知道如何为日志记录操作设置超时?如果服务器没有响应,甚至更好地忽略它?

1 个答案:

答案 0 :(得分:1)

我认为如果没有来自服务器的响应,最好忽略它,因为你无法知道服务器什么时候会重新上线,而且你通常不想因为记录而保持应用程序。< / p>

BTW SocketHandler,当套接字连接尝试失败时,尝试使用指数退避策略重新连接,使用以下属性及其默认值

retryStart = 1.0
retryMax = 30.0
retryFactor = 2.0

因此,如果套接字创建失败,它将在retryStart秒之后再次尝试(在下一次日志记录调用中),并且在每次后续失败之后,重试之前的延迟将增加retryFactor upto {{ 1}}。