2013-03-15 13 views
13

Mam aplikację, która musi uruchomić szereg uruchomień symulacji. Chcę ustawić mechanizm logowania, w którym wszystkie logrecords są rejestrowane w pliku general.log, a wszystkie dzienniki do uruchomienia symulacji przejść do run00001.log, .... W tym celu zdefiniowałem Run klasy. w __init__() dodano nową obsługę pliku do runlog.Python nie wypuszcza uchwytów plików do pliku logu

Problem polega na tym, że logi dla przebiegów nigdy nie zostają zwolnione, więc po wielu przebiegach dostępne uchwyty są wyczerpane, a bieg zawiesza się.

Wcześniej skonfigurować pewne procedury, aby przetestować ten sposób następujący

główna procedura

import Model 
try: 
    myrun = Model.Run('20130315150340_run_49295') 
    ha = raw_input('enter') 
    myrun.log.info("some info") 
except: 
    traceback.print_exc(file=sys.stdout) 

ha = raw_input('enter3') 

Klasa Run jest zdefiniowana w module modelu następująco

import logging 
class Run(object): 

    """ Implements the functionality of a single run. """ 
    def __init__(self, runid): 
     self.logdir="." 
     self.runid   = runid 
     self.logFile  = os.path.join(self.logdir , self.runid + '.log') 
     self.log   = logging.getLogger('Run'+self.runid) 
     myformatter   = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') 
     myhandler  = logging.FileHandler(self.logFile) 
     myhandler.setLevel(logging.INFO) 
     myhandler.setFormatter(myformatter) 
     self.log.addHandler(myhandler) 

Potem użyj program explorer procesu, aby śledzić obsługę plików. I widzę, jak pojawiają się dzienniki, ale nigdy nie znikają.

Czy istnieje sposób, w jaki mogę to wymusić?

+1

Dlaczego znowu nie usunąć obsługi Po zakończeniu uruchomić? Przypuszczalnie można wciągnąć się w to wydarzenie? –

+0

Wszelkie porady, jak to zrobić? Próbowałem z określeniem self.log.removeHandler (myhandler) w __del __(), nawet przez bezpośrednie wywołanie destruktora (myrun .__ del __()). Próbowałem również przez określenie w __exit __() i przy użyciu instrukcji z, jak zasugerowano do otwierania uchwytów plików z otwartym. Ale jak dotąd nie udało się. –

+1

Musisz również wywołać '.close()' na filehandler. 'self.log.handlers [0] .close()' powinno wystarczyć. –

Odpowiedz

32

Musisz zadzwonić pod numer .close() w folderze plików.

Po zakończeniu klasa Run, zadzwoń:

handlers = self.log.handlers[:] 
for handler in handlers: 
    handler.close() 
    self.log.removeHandler(handler) 
+0

Czy "[:]" nie utworzy się kopia listy programów obsługi? –

+0

@VasilisLemonidis: tak, o to chodzi. Nie powinieneś wykonywać iteracji na liście i usuwać z niej elementów, skończysz w pomijaniu elementów. –

+0

@VasilisLemonidis: alternatywą może być przetwarzanie elementów w odwrotnej kolejności: 'dla handler in reverse (self.log.handlers): ...'. –

Powiązane problemy