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ć?
Dlaczego znowu nie usunąć obsługi Po zakończeniu uruchomić? Przypuszczalnie można wciągnąć się w to wydarzenie? –
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ę. –
Musisz również wywołać '.close()' na filehandler. 'self.log.handlers [0] .close()' powinno wystarczyć. –