记录多个对象:IOError

时间:2016-08-28 00:12:56

标签: python python-2.7 logging

我有一个名为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()

是否有模式/方法可以拥有数千个记录器?

2 个答案:

答案 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)