55

多数のシミュレーションを実行する必要があるアプリケーションがあります。すべてのログレコードがgeneral.logに記録され、シミュレーション実行のすべてのログがrun00001.logに移動するログメカニズムを設定したいと思います。このために、クラスRunを定義しました。で、__init__()新しいファイルハンドルがrunlogに追加されます。

問題は、実行のログファイルが解放されないため、何度も実行した後、使用可能なハンドルが使い果たされ、実行がクラッシュすることです。

私はこれをテストするためにいくつかのルーチンを次のように設定しました

メインルーチン

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

Runクラスは、モジュールModelで次のように定義されています。

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) 

次に、プログラムプロセスエクスプローラーを使用してファイルハンドラーを追跡します。そして、runlogが表示されますが、消えることはありません。

これを強制する方法はありますか?

4

4 に答える 4

98

.close()filehandlerを呼び出す必要があります。

Runクラスが完了したら、次の電話番号に電話してください。

handlers = self.log.handlers[:]
for handler in handlers:
    handler.close()
    self.log.removeHandler(handler)
于 2013-03-18T10:29:14.077 に答える