2016-08-28 5 views
0

私はロガーログ:例外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) 

と仕事を持っているJobと呼ばれるクラスが消灯しているがjob.logger.info()

を通じて何かとログを行うが、私は複数のジョブが何千、すなわち持っているとき、それはです私はを上書きしてきたように、エラー

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

を投げ、私は、私は、それはファイルを閉じ開くと何かをログに記録するたびに考えました

何千ものロガーがあるパターン/方法はありますか?

+0

@martineauはい、obvは全体の点ではありませんが、問題を克服するのに十分です.highlightしようとしています... – ealeon

+0

fyi log_formatterはクラスJobの直上です。 self.logに使われているのは、ログファイルのパスであるself.log.fileだけです。 – ealeon

+0

は1つの変更を加えました。あなたの懸念に対応する必要があります@martineau – ealeon

答えて

0

オペレーティングシステムのファイルハンドルが不足していると推測します。代わりに、直接self.logger.info(msg)を実行するので

+0

それは明らかです。私の質問は、それが使用されているときにのみ開くようにファイルハンドルを閉じるにはどうすればいいですか? – ealeon

0

ちなみに、私はただのFileHandler開き、それをログに毎回イム書き込みを閉じて、次のコード..

書き換え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) 
関連する問題