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ı?
neden tekrar ne zaman koşmak bitirir işleyicisi kaldırmaz? Muhtemelen o olaya karışabilirsin? –
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. –
Dosya el kitabında da '.close()' işlevini çağırmanız gerekir. self.log.handlers [0] .close() 'yeterli olmalı, gerçekten. –