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
モジュールからのメッセージはログファイルに記録されません。
私の問題は何ですか?
これを解決するには、 'logger = logging.getLogger(__ name __)'行を 'testLog()'メソッドの内部に移動するのですか?それは、私が使用するすべてのモジュールのすべてのメソッドで、そのメソッドのスコープに存在するロギングオブジェクトを作成することによってメソッドを開始する必要があるということですか? – Skitzafreak
機能の外でロガーオブジェクトを取得しているため、これは役に立ちません。あなたのパッケージがロードされたときに最初に実行されるように、 '' __init __。py''、* before * importingテストの '' fileConfig''呼び出しを最上位レベルに移動することは助けになります –
Ahh大丈夫です。したがって、ロギングライブラリをインポートし、ロギングを実装し、インポートし、他のすべてを実行します。 Gotcha – Skitzafreak