我在这里进行了广泛的搜索而没有特别关于我的问题。
目前,我的程序存在与文件描述符溢出有关的问题(打开的文件太多),几乎所有文件都指向我的单个日志文件。我的节目以这种方式出发:
在我的主要:
# 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个日志文件引用。
非常感谢和抱歉我的编程语法存在缺陷。
答案 0 :(得分:0)