2013-03-15 22 views
13

Bir dizi simülasyon çalışması yürütmek zorunda olan bir uygulamam var. Tüm logrecor'ların bir general.log dosyasına kaydedildiği ve bir simülasyon çalışması için tüm logların run00001.log adresine gittiği bir loglama mekanizması kurmak istiyorum. Bunun için bir Run sınıfı tanımladım. __init__()'da, runlog için yeni bir dosya eklenmiştir.python, dosya listelerini log dosyasına yazmaz

Sorun, işlemlerin günlük dosyalarının hiçbir zaman serbest bırakılmamasıdır; bu nedenle, birkaç çalıştırmadan sonra kullanılabilir tutamaçlar tükenir ve çalışma bozulur. Kullandığım Sonra

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) 

şöyle

ana rutin

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') 

sınıf Run modülü Modeli tanımlanan şöyle

Bunu test etmek için bazı rutinler kurdum filehandlers takip etmek için program süreci kaşif. Ve ben de runlogların göründüğünü görüyorum ama asla ortadan kaybolma.

Bunu zorlayabilmemin bir yolu var mı?

+1

neden tekrar ne zaman koşmak bitirir işleyicisi kaldırmaz? Muhtemelen o olaya karışabilirsin? –

+0

Bunu nasıl yapacağınız konusunda herhangi bir öneriniz var mı? Destroctor'ı açıkça (myrun .__ del __()) çağırarak bile, self.log.removeHandler (myhandler) 'i __del __() olarak belirtmeyi denedim. Ayrıca, __exit __() 'de ve açık bir şekilde dosya eleklerini açmak için önerildiği gibi bir ifadeyi kullanarak da denedim. Ama şimdiye kadar başarı yok. –

+1

Dosya el kitabında da '.close()' işlevini çağırmanız gerekir. self.log.handlers [0] .close() 'yeterli olmalı, gerçekten. –

cevap

32

Dosya tanıtıcısında .close() numaralı telefonu aramanız gerekir. senin Run sınıf tamamlar

, çağrı:

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

[:] İşleyici listesinin bir kopyasını oluşturmuyor musunuz? –

+0

@VasilisLemonidis: Evet, konu bu. Bir liste üzerinde yinelememelisiniz ve öğelerini kaldırmamalısınız, öğelerin atlanmasıyla sonuçlanacaksınız. –

+0

@VasilisLemonidis: alternatif, tersine döndürülen öğelerin işlenmesi olabilir: 'tersine çevrilmiş işleyici için (self.log.handlers): ...'. –

İlgili konular