2017-08-02 17 views
0

私はPythonプログラム内でロギングを実装しようとしています。目標は、ログファイルが作成され、さまざまなモジュールを使用してプログラムが実行するすべてのものが(ロギングレベルに基づいて)記録されるように設定することです。これは私の現在のコードは次のようになります。ログ設定のためのPythonログ、ファイルに書き込まない

テキストファイル:

#logging.conf 
[loggers] 
keys=root,MainLogger 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_MainLogger] 
level=DEBUG 
handlers=consoleHandler 
qualname=MainLogger 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=consoleFormatter 
args=(sys.stdout,) 

[formatter_consoleFormatter] 
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%lineno)04d | %(message)s 

テストログへの外部モジュール:

#test.py 
import logging 

logger = logging.getLogger(__name__) 

def testLog(): 
    logger.debug("Debug Test") 
    logger.info("Info Test") 
    logger.warning("Warning Test") 
    logger.error("Error Test") 

メインファイル:

現在
#__init__.py 
import logging 
import logging.config 
from datetime import datetime 

logging.config.fileConfig('logging.conf', disable_existing_loggers = False) 
logger = logging.getLogger('MainLogger') 
fileHandler = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) 
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fileHandler.setFormatter(formatter) 
logger.addHandler(fileHandler) 

if __name__ == "__main__": 

    import test 
    logger.debug("Debug Test") 
    test.testLog() 

、私はを実行すると、現在、すべてのログメッセージがIDLE3シェルで表示されていますとログファイルが作成されています。しかし、ログファイル自体の中に記録されるのは、__init__.pyの "Debug Test"だけです。 test.pyモジュールからのメッセージはログファイルに記録されません。

私の問題は何ですか?

答えて

0

で、後で__init__.pyに設定する前に、loggerオブジェクトを取得します。ロガー・インスタンスを取得する前に、ロギング・モジュールを最初に構成するようにしてください。

+0

これを解決するには、 'logger = logging.getLogger(__ name __)'行を 'testLog()'メソッドの内部に移動するのですか?それは、私が使用するすべてのモジュールのすべてのメソッドで、そのメソッドのスコープに存在するロギングオブジェクトを作成することによってメソッドを開始する必要があるということですか? – Skitzafreak

+0

機能の外でロガーオブジェクトを取得しているため、これは役に立ちません。あなたのパッケージがロードされたときに最初に実行されるように、 '' __init __。py''、* before * importingテストの '' fileConfig''呼び出しを最上位レベルに移動することは助けになります –

+0

Ahh大丈夫です。したがって、ロギングライブラリをインポートし、ロギングを実装し、インポートし、他のすべてを実行します。 Gotcha – Skitzafreak

関連する問題