Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用单个FileHandler的Python日志记录导致打开的文件(文件描述符)过多_Python_Python 2.7_Logging_File Descriptor - Fatal编程技术网

使用单个FileHandler的Python日志记录导致打开的文件(文件描述符)过多

使用单个FileHandler的Python日志记录导致打开的文件(文件描述符)过多,python,python-2.7,logging,file-descriptor,Python,Python 2.7,Logging,File Descriptor,关于我的问题,我在这里进行了广泛的搜索,但运气不太好 目前,我的程序存在与文件描述符溢出(打开的文件太多)相关的问题,几乎所有文件都指向我的单个日志文件。我的计划是这样制定的: 在我看来: # Initializes program log handler log = Log() log.setup_custom_logger('root') logger = logging.getLogger('root') 在日志类中: def setup_custom_

关于我的问题,我在这里进行了广泛的搜索,但运气不太好

目前,我的程序存在与文件描述符溢出(打开的文件太多)相关的问题,几乎所有文件都指向我的单个日志文件。我的计划是这样制定的:

在我看来:

    # Initializes program log handler
    log = Log()
    log.setup_custom_logger('root')

    logger = logging.getLogger('root')
在日志类中:

def setup_custom_logger(self, name):
    """ Sets base log handler for the program and log entry formatting """

    # Create logger
    logger = logging.getLogger(name)

    log_level = self.getLogLevel()
    logger.setLevel(log_level)

    # Sets formatting, output file and handler
    handler = logging.FileHandler(
            os.getenv("HOME") + config.LOG_DIRECTORY + 'qtgtool.log')
    handler.setFormatter(self.getFormat(log_level))
    # Add handler to logger
    logger.addHandler(handler)
在程序中的任何其他类中,这在其init中调用:

    logger = logging.getLogger('root')
我已经检查过了,并且只有一个FileHandler对象被所有类使用。因此,我不知道为什么在创建类对象时会在日志中创建这么多文件描述符。。。还是我遗漏了什么?是不是太多的类对象都具有日志功能

回溯的输出:

IOError: [Errno 24] Too many open files:/path/to/file/being/read.txt
这与lsof-p对应,指示1024个打开的文件(几乎所有的日志文件)。作为旁注,我已经看到了增加打开文件数量的选项。我不想这样做,因为我发现这完全失去了试图解决问题的意义

通过使用此类而不是日志记录进行进一步调试。FileHandler()

这会将单个“打开的文件”打印到控制台,而lsof(已经是程序的早期阶段)会显示100多个日志文件引用


非常感谢并为我的编程语法中的缺陷道歉。

请尝试以下代码关闭该文件:

logger.removeHandler(handler)
“handler”是创建的“FileHandler”实例


从。

请尝试以下代码关闭文件:

logger.removeHandler(handler)
“handler”是创建的“FileHandler”实例


来自。

您得到的确切错误消息(回溯)是什么?@DonCristobal我已将其添加到问题中。回溯的其余部分只是与父.py进程相关的三行,它们在最终进程失败之前顺序调用了彼此。我尝试了以下操作:根据主模块中的代码设置记录器,使用logging.getLogger获取记录器,使用一个类导入另一个模块,该类的init尝试使用logging.getLogger('root')访问同一个记录器。lsof-p未多次显示记录器文件,即该文件仅打开一次。您的代码中可能还有其他内容,或者您从其他地方实例化了Log()?(另外,为了澄清,我假设“/path/to/file/being/read.txt”指的是qtgtool.log文件?@DonCristobal它发生过多次,但令人沮丧的是,我今天注意到,它并不经常发生,只显示了一个实例。打开的文件只是我试图打开的另一个文件,它使程序超出了限制。但是,日志文件占打开文件描述符的99%。我已经检查过了,没有其他安装\自定义\记录器实例。另一个是Log(),但传递了init。“我正在运行一个linux ubuntu gnome系统,如果这有什么不同的话。”DonCristobal补充了上面的结果。我想那就是你想要的?很抱歉,如果不是,我对python比较陌生。。。我只对日志做了另一个引用,那就是在我的日志窗口中,我将QProcess与“self.process.start”('tail-n'+line+'-F'+self.matches[0])一起使用。但是,这一阶段尚未初始化。您得到的确切错误消息(回溯)是什么?@DonCristobal我已将其添加到问题中。回溯的其余部分只是与父.py进程相关的三行,它们在最终进程失败之前顺序调用了彼此。我尝试了以下操作:根据主模块中的代码设置记录器,使用logging.getLogger获取记录器,使用一个类导入另一个模块,该类的init尝试使用logging.getLogger('root')访问同一个记录器。lsof-p未多次显示记录器文件,即该文件仅打开一次。您的代码中可能还有其他内容,或者您从其他地方实例化了Log()?(另外,为了澄清,我假设“/path/to/file/being/read.txt”指的是qtgtool.log文件?@DonCristobal它发生过多次,但令人沮丧的是,我今天注意到,它并不经常发生,只显示了一个实例。打开的文件只是我试图打开的另一个文件,它使程序超出了限制。但是,日志文件占打开文件描述符的99%。我已经检查过了,没有其他安装\自定义\记录器实例。另一个是Log(),但传递了init。“我正在运行一个linux ubuntu gnome系统,如果这有什么不同的话。”DonCristobal补充了上面的结果。我想那就是你想要的?很抱歉,如果不是,我对python比较陌生。。。我只对日志做了另一个引用,那就是在我的日志窗口中,我将QProcess与“self.process.start”('tail-n'+line+'-F'+self.matches[0])一起使用。但是,此阶段尚未初始化。