记录模块:打开文件描述符太多

时间:2015-05-07 10:54:26

标签: python linux logging

我正在使用Python logging模块将日志打印到文件中,但是我遇到了#34;太多打开文件描述符"的问题,我确实记得关闭日志文件处理程序,但是问题仍然存在。

以下是我的代码

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

2 个答案:

答案 0 :(得分:2)

不,不。用法简单得多

java

在您的情况下,您将在每个日志记录操作中附加处理程序,这至少是过度的。

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

答案 1 :(得分:1)

每次记录任何内容时,都会添加另一个处理程序实例。

是的,你每次都关闭它。但这只是意味着爆炸需要更长的时间。关闭它并不会将其从记录器中删除。

第一条消息,你有一个处理程序,所以你打开一个文件描述符,然后关闭它。

下一条消息,你有两个处理程序,所以你打开两个文件描述符并关闭它们。

下一条消息,您打开三个文件描述符并关闭它们。

依此类推,直到您打开的文件描述符超出了您的允许范围,并且您收到错误。

解决方案就是不这样做。