2012-02-29 7 views
4

私は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

+0

slaveLogはグローバルオブジェクトであり、runMain()で毎回addHandlerを呼び出します。 – pkit

+0

ありがとうございます。私は、fileHandlerを追加する前に、 "if not len(slaveLog.handlers):"を使用して回避しました。私は、ロギングモジュールが同じfileHandlerを複数回追加しないという(間違った)印象を受けました。 – Jak

答えて

5

logging.getLogger([name])は常に同じオブジェクト(グローバルオブジェクト)を返し、あなたはそれにあなたがrunMainを呼び出すたびにはaddHandlerを呼び出します。

+0

返信いただきありがとうございます:-)私は、ロガーモジュールが既に存在するHandlerを追加しないと考えましたか?同じ[名前]が呼び出されるたびに、別のハンドラを追加し続ける理由はありません。私はremoveHandler()関数を実行することもできますが、何も削除しません。 – Jak

+2

pkitによれば、あなたは間違っていると言います。 1つの場所にのみロギング(ハンドラの追加、レベルの設定など)を設定する必要があります。このポストを参照してください:http://eric.themoritzfamily.com/learning-python-logging.html –

+0

ありがとう私は今それを持っています:-) slave.pyは時々スクリプトとして呼び出されます。そのシナリオで私はslave.pyでログを設定してください。しかし、slave.pyもmaster.pyによって複数回呼び出されます。その場合、ロギングは既に設定されているため、slave.pyは同じfileHandlerを何度も追加してエラーを出します。 – Jak

0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import logging.handlers 
from logging.config import dictConfig 

logger = logging.getLogger(__name__) 

DEFAULT_LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
} 
def configure_logging(logfile_path): 
    """ 
    Initialize logging defaults for Project. 

    :param logfile_path: logfile used to the logfile 
    :type logfile_path: string 

    This function does: 

    - Assign INFO and DEBUG level to logger file handler and console handler 

    """ 
    dictConfig(DEFAULT_LOGGING) 

    default_formatter = logging.Formatter(
     "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s", 
     "%d/%m/%Y %H:%M:%S") 

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8') 
    file_handler.setLevel(logging.INFO) 

    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 

    file_handler.setFormatter(default_formatter) 
    console_handler.setFormatter(default_formatter) 

    logging.root.setLevel(logging.DEBUG) 
    logging.root.addHandler(file_handler) 
    logging.root.addHandler(console_handler) 



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module 

メインの機能でロギングフォーマットを設定する方がよいでしょう。

関連する問題