我有一个名为Job
的类,它有一个记录器
class MyFileHandler(logging.FileHandler):
def __init__(self, filename):
self.filename = filename
super(MyFileHandler, self).__init__(filename)
def emit(self, record):
log_text = self.format(record)
try:
fh = open(self.filename, "a")
fh.write("%s\n" % log_text)
fh.close()
return True
except:
return False
log_formatter = logging.Formatter('br: %(message)s')
class Job(object):
def __init__(self, name):
self.name = name
self.logger = logging.getLogger(self.name)
log_hdlr = MyFileHandler('/tmp/%s' % name)
log_hdlr.setFormatter(log_formatter)
self.logger.addHandler(log_hdlr)
self.logger.setLevel(logging.INFO)
jobs = []
for i in range(100):
j = Job(str(i))
job.append(j)
并且通过job.logger.info()
但是当我有多个工作,即成千上万时,就会抛出错误
IOError: [Errno 24]
Too many open files:
'/x/prototype_3885946_1608131132/cm/cm_conv/logs/20160827-195925.log'
我以为每次记录某些内容时,都会打开然后关闭文件,因为我覆盖了emit()
是否有模式/方法可以拥有数千个记录器?
答案 0 :(得分:0)
猜猜你的操作系统没有文件句柄。
答案 1 :(得分:0)
Fyi,而不是直接执行self.logger.info(msg)
,我只是将它包装在下面的代码中,它打开文件处理程序并在每次写入日志时关闭它。
将self.logger.info(msg)
重写为self.write_to_log(msg)
其中:
def write_to_log(self, msg):
log_hdlr = MyFileHandler('/tmp/%s' % self.name)
log_hdlr.setFormatter(log_formatter)
self.logger.addHandler(log_hdlr)
self.logger.setLevel(logging.INFO)
self.logger.info(msg) # <----- actually calling .info() here
for handler in self.logger.handlers:
handler.close()
self.logger.removeHandler(handler)