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

时间:2017-01-11 08:12:56

标签: python python-2.7 logging file-descriptor

我在这里进行了广泛的搜索而没有特别关于我的问题。

目前,我的程序存在与文件描述符溢出有关的问题(打开的文件太多),几乎所有文件都指向我的单个日志文件。我的节目以这种方式出发:

在我的主要:

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

    logger = logging.getLogger('root')

在Log类中:

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个打开的文件(几乎所有我的日志文件)。作为旁注,我看到了增加打开文件数的选项。我不想这样做,因为我发现这完全忽略了试图解决问题的重点。

使用此类而不是logging.FileHandler()进行进一步调试:

class FHandler(logging.FileHandler):

    def __init__(self, filename, encoding=None, delay=0):
        logging.FileHandler.__init__(self, filename, 'w', encoding, delay)

    def _open(self):
        logging.FileHandler._open(self)        
        print 'Opened file'

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

非常感谢和抱歉我的编程语法存在缺陷。

1 个答案:

答案 0 :(得分:0)

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

logger.removeHandler(handler)

“处理程序”是创建的“ FileHandler”实例。

来自here