1

我正在实现 pythonlogging模块,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 [sec] 这对于生产来说是不可接受的。

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

所以如果我会使用logger.debug("....")它不会花费太多时间。

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

4

1 回答 1

1

如果服务器没有响应,我认为最好忽略它,因为您无法知道服务器何时会重新联机,而且您通常不想因为日志记录而暂停应用程序。

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

retryStart = 1.0
retryMax = 30.0
retryFactor = 2.0

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

于 2013-11-03T21:25:28.990 回答