2017-10-18 14 views
1

を重複しましたA.pyとB.py、今私はいつでも私はそれらを呼び出すときにすべての情報を記録する必要があります。Pythonのログは私がの機能を使用するには、メイン使用しています4つのファイル、</p> <ul> <li>Main.py</li> <li>A.py</li> <li>B.py</li> <li>Log_System</li> </ul> <p>を持って

ので、私は、私は、スクリプトファイルA.pyでロギングを使用したい場合はそうなA.py、B.py

として
import logging 

def fetchLogger(name="None") : 
    logger = logging.getLogger(__name__) 
    logger.setLevel(logging.DEBUG) 

    if (name == "None"): 
     #create File for Log 
     handler = logging.FileHandler('./engine_log/Generic.log') 
     handler.setLevel(logging.DEBUG) 
     #log format 
     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
     handler.setFormatter(formatter) 

     #adding the handler to Logging System 
     logger.addHandler(handler) 
    else: 
     #create File for Log 
     handler = logging.FileHandler('./engine_log/'+str(name)) 
     handler.setLevel(logging.DEBUG) 
     #log format 
     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
     handler.setFormatter(formatter) 
     #adding the handler to Logging System 
     logger.addHandler(handler) 
    return logger 

を各スクリプトファイルのログハンドラを作成するためにlog_systemというスクリプトを書きましたそれは担当者である

import log_system 
"""Log System Building """ 
file_name = 'A.py' 
logger = log_system.fetchLogger(file_name) 

def hello(): 
    try: 
     logger.info("excuting Hello") 
    except: 
     logger.debug("something went wrong in hello") 

が、私のログファイル

2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello 
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello 
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello 
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello 
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello 

:これらの行を記述しますログを何度も食べています.... どうすればいいですか?

ソリューション

logger = logging.getLogger(name) 

    if logger.hasHandlers(): 
     logger.handlers = [] 

    logger.setLevel(logging.DEBUG) 

    #create File for Log 
    handler = logging.FileHandler('./engine_log/'+str(name)) 
    handler.setLevel(logging.DEBUG) 
    #log format 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    handler.setFormatter(formatter) 
    #adding the handler to Logging System 
    logger.addHandler(handler) 

    return logger 

これは私が私のlog_systemコードを変更し、それが重複するレコードを作成しないように、私はすでにログハンドラを作成した場合、私はちょうどハンドラのリストを空にする方法です。

答えて

0

fetch_loggerが呼び出されるたびに、FileHandlerがロガーに追加されます。各FileHandlerはログファイルに書き込みを行い、その結果、ファイルに繰り返し出力されます。

1つの解決方法は、ロガーのhasHandlersメソッドを呼び出すことです。これは、ロガーにハンドラが設定されている場合にTrueを返します。その後、それらを削除できます。

def fetchLogger(name="None") : 
    logger = logging.getLogger(__name__) 
    if logger.hasHandlers(): 
     # Logger is already configured, remove all handlers 
     logger.handlers = [] 
    # Configure the logger as before. 
    ... 
+0

この解決策はありがとうございました。 –

関連する問題

 関連する問題