簡體   English   中英

日志記錄模塊:打開文件描述符過多

[英]Logging module: too many open file descriptors

我正在使用Python logging模塊將日志打印到文件中,但是遇到了“打開文件描述符過多”的問題,我確實記得關閉了日志文件處理程序,但是問題仍然存在。

下面是我的代碼

class LogService(object):
    __instance = None
    def __init__(self):
        self.__logger = logging.getLogger('ddd')
        self.__handler = logging.FileHandler('/var/log/ddd/ddd.log')
        self.__formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        self.__handler.setFormatter(self.__formatter)
        #self.__logger.addHandler(self.__handler)

    @classmethod
    def getInstance(cls):
        if cls.__instance == None:
            cls.__instance = LogService()

        return cls.__instance

    # log Error
    def logError(self, msg):
        self.__logger.addHandler(self.__handler)
        self.__logger.setLevel(logging.ERROR)
        self.__logger.error(msg)
        # Remember to close the file handler
        self.closeHandler()

    # log Warning
    def logWarning(self, msg):
        self.__logger.addHandler(self.__handler)
        self.__logger.setLevel(logging.WARNING)
        self.__logger.warn(msg)
        # Remember to close the file handler
        self.closeHandler()

    # log Info
    def logInfo(self, msg):
        self.__logger.addHandler(self.__handler)
        self.__logger.setLevel(logging.INFO)
        self.__logger.info(msg)
        # Remember to close the file handler
        self.closeHandler()

    def closeHandler(self):
        self.__logger.removeHandler(self.__handler)
        self.__handler.close()

在運行這段代碼一段時間之后,以下內容顯示打開的文件描述符過多。

[root@my-centos ~]# lsof | grep ddd | wc -l
11555

不,不。 用法要簡單得多

import logging
logging.basicConfig()

logger = logging.getLogger("mylogger")
logger.info("test")
logger.debug("test")

在您的情況下,您將在每個日志記錄操作中附加處理程序,這至少有點過頭。

查看文檔https://docs.python.org/2/library/logging.html

每次您記錄任何內容時,都將添加處理程序的另一個實例。

是的,您每次都關閉它。 但這僅意味着炸毀需要更長的時間。 關閉它並不會將其從記錄器中刪除。

第一條消息,您有一個處理程序,因此您打開一個文件描述符,然后將其關閉。

在下一條消息中,您有兩個處理程序,因此您打開了兩個文件描述符並關閉了它們。

在下一條消息中,您將打開三個文件描述符並關閉它們。

依此類推,直到您打開的文件描述符超出允許的范圍,然后您會得到一個錯誤。

解決方案就是不這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM