2016-08-28 2 views
0

Ich habe eine Klasse Job genannt, die einen LoggerProtokollierung für mehrere Objekte: IOError

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) 

und Jobs aus über job.logger.info()

etwas tun und Protokolle gehen muss, aber wenn ich mehrere Jobs haben Tausende dh, es ist werfen Fehler

IOError: [Errno 24] 
    Too many open files: 
     '/x/prototype_3885946_1608131132/cm/cm_conv/logs/20160827-195925.log' 

dachte ich jedes Mal, wenn ich etwas angemeldet, würde es öffnen sie dann die Datei schließen, wie ichüberschrieben

Gibt es ein Muster/Möglichkeiten, Tausende von Loggern zu haben?

+0

@martineau ja, obv das ist nicht der springende Punkt aber genug, um über das Problem zu kommen im Versuch, hightlight ... – ealeon

+0

fyi log_formatter ist direkt über Klasse Job. Das einzige, was für self.log verwendet wird, ist self.log.file, was nur der Pfad zur Logdatei ist. – ealeon

+0

gemacht eine Änderung .. und es sollte Ihre Bedenken adressieren @martineau – ealeon

Antwort

0

Raten Sie, dass Ihrem Betriebssystem die Dateizugriffsnummern ausgehen.

+0

gut das ist offensichtlich. Meine Frage ist, wie schließe ich die Dateigriffe, so dass es nur öffnet, wenn es verwendet wird .... und nicht offen zu lassen, wenn es nicht schreibt – ealeon

0

Fyi, statt self.logger.info(msg) direkt ausführen, ich wickelte es nur um den folgenden Code, der Filehandler öffnet und schließt sie jedes Mal im Schreiben in ein Protokoll ..

Rewrite self.logger.info(msg)-self.write_to_log(msg)

Wo: