私はPythonロギングモジュールに問題があります。ここで何か愚かなことをしているのかどうかはわかりませんが、私は2つのPythonスクリプト(master.py)を持っています。 py)。それらはどちらもログファイルを分離するためにロギングされますが、呼び出されている2番目のスクリプト(slave.py)は再帰的にログに記録されます。複数のファイルをロギングするPython
私はここで間違っているのを誰も見ることができますか?ここで
は私のコードです:ここでは
# master.py
import sys
import logging
import slave
masterLog = logging.getLogger('master')
masterLog.setLevel(logging.DEBUG)
masterHandler = logging.FileHandler('master.log')
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
masterHandler.setFormatter(formatter)
masterLog.addHandler(masterHandler)
masterLog.info('This is masterLog running on master.py')
print 'master.py has: ', len(masterLog.handlers), 'handlers'
for i in range(1,6):
masterLog.info('Running slave %s' % i)
slave.runMain()
# slave.py
import sys
import logging
def runMain():
slaveLog = logging.getLogger('slave')
slaveLog.setLevel(logging.DEBUG)
slaveHandler = logging.FileHandler('slave.log')
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
slaveHandler.setFormatter(formatter)
slaveLog.addHandler(slaveHandler)
slaveLog.info('This is slaveLog running on slave.py')
print 'slave.py has: ', len(slaveLog.handlers), 'handlers'
if __name__ == '__main__':
runMain()
が出力されます。
master.py has: 1 handlers
slave.py has: 1 handlers
slave.py has: 2 handlers
slave.py has: 3 handlers
slave.py has: 4 handlers
slave.py has: 5 handlers
そしてmaster.log:
INFO: 2012-02-29 13:26:49 <module>(13) -- This is masterLog running on master.py
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 1
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 2
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 3
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 4
INFO: 2012-02-29 13:26:49 <module>(17) -- Running slave 5
そして、slave.log:
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
INFO: 2012-02-29 13:26:49 runMain(13) -- This is slaveLog running on slave.py
スレーブスクリプトは、呼び出されるたびに新しいファイルHandlerを追加するようです。 slave.logファイルには5つのエントリしかないはずですが、slave.pyが呼び出されるたびに、ロガーがすべてのファイルハンドラに出力します!
おかげで、 のJak
slaveLogはグローバルオブジェクトであり、runMain()で毎回addHandlerを呼び出します。 – pkit
ありがとうございます。私は、fileHandlerを追加する前に、 "if not len(slaveLog.handlers):"を使用して回避しました。私は、ロギングモジュールが同じfileHandlerを複数回追加しないという(間違った)印象を受けました。 – Jak