linux 日志模块:打开的文件描述符太多

yk9xbfzb  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(156)

我正在使用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

zf9nrax1

zf9nrax11#

不,不。用法要简单得多

import logging
logging.basicConfig()

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

字符串
在您的例子中,您在每个日志操作中都附加了处理程序,这至少是多余的。
查看文档https://docs.python.org/2/library/logging.html

mlnl4t2r

mlnl4t2r2#

每次记录任何内容时,都要添加处理程序的另一个示例。
是的,你每次都关闭它。但这只是意味着它需要稍微长一点的时间来放大。关闭它并不会将它从记录器中删除。
第一条消息,你有一个处理程序,所以你打开一个文件描述符,然后关闭它。
下一条消息,你有两个处理程序,所以你打开两个文件描述符,然后关闭它们。
在下一条消息中,您打开了三个文件描述符并关闭了它们。
依此类推,直到打开的文件描述符超过允许的数量,然后出现错误。
唯一的解决办法就是不要那样做。

wribegjk

wribegjk3#

在我的情况下,我的蜘蛛项目,与lib“httpx”,“调度程序”,崩溃后运行几天,抛出SystemError: (libev) error creating signal/async pipe: Too many open files.
一开始,我怀疑httpx和调度器,最后我发现了这个问题页面。我意识到我在类__init__()方法中写了logging.getLogger(__name__),类被调度器调用,结果日志记录器示例增加,并且在调度器线程运行时不会被删除。

相关问题