2017-12-02 1 views
1

私は以下の構造を有する小型のPythonプロジェクトに取り組んでいる - 次のように私はプロジェクトの下__init.py__にロギング設定を設定したPythonのロギング - 複数のモジュール

project 
-- logs 
-- project 
    __init.py__ 
    classA.py 
    classB.py 
    utils.py 
-- main.py 

import logging 
from logging import StreamHandler 
from logging.handlers import RotatingFileHandler 

# Create the Logger 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.INFO) 

# Create the Handler for logging data to a file 
logger_handler = RotatingFileHandler('logs\\mylog.log', maxBytes=1024, backupCount=5) 
logger_handler.setLevel(logging.INFO) 

#Create the Handler for logging data to console. 
console_handler = StreamHandler() 
console_handler.setLevel(logging.INFO) 

# Create a Formatter for formatting the log messages 
logger_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s') 

# Add the Formatter to the Handler 
logger_handler.setFormatter(logger_formatter) 
console_handler.setFormatter(logger_formatter) 

# Add the Handler to the Logger 
logger.addHandler(logger_handler) 
logger.addHandler(console_handler) 

このように設定すると、プロジェクトレベル全体ではなく、パッケージレベルでルートロガーを設定するように見えます。結果として、main.pyのログされたステートメントはログファイルには表示されませんが、classAclassButils.pyの2つのクラスのすべてのログステートメントは、コンソールとログファイルに期待どおりにルーティングされます。

ログを一度設定してプロジェクト全体で使用できるようにするにはどうすればよいですか?私は、logging.py設定をmain.pyに移そうとしましたが、動作していないようです。

def setupLogging(): 
    # Create the Logger 
    logger = logging.getLogger(__name__) 
    logger.setLevel(logging.INFO) 
    ..etc.. 

def main(): 
    setupLogging() 

if __name__ == "__main__": 
    main() 

答えて

1

あなたが最初の各パッケージを個別にではなく、しようとしたように、プロジェクト全体のために一度だけログを設定するには、正しいです。あなたは間違っていた何

あなただけの現在のモジュールのロガー設定されています。その代わりの

logger = logging.getLogger(__name__) 

を、あなたはルートロガーを設定したい:

root_logger = logging.getLogger() 
root_logger.setLevel(logging.INFO) 

# ... 

root_logger.addHandler(logger_handler) 
root_logger.addHandler(console_handler) 

のために行われた構成ルートロガーは明示的にオーバーライドしないすべてのロガーに適用されます。実際にログインしたとき

その後、あなたは、特定のロガーを使用する必要があります。

logger = logging.getLogger(__name__) 

logger.warning("I am warning you about %s", something) 
+0

こんにちは、助言に感謝を。出来た!私はしかし、フォローアップの質問があります。この方法でルートロガーを設定すると、インポートされた他のモジュールのレベルが設定されているようになり、ログファイルにサードパーティのインポートされたモジュールからもメッセージが届くようになります。私が書いたモジュールからのみメッセージを記録するには? – theguyoverthere

+0

それぞれのレベルを設定することができます。 'logging.getLogger(" product ")。setLevel(logging.INFO)'または 'logging.getLogger(" numpy ")。setLevel(logging.DEBUG)'です。ただし、ロギング設定ファイルを使用する方が簡単です(https://docs.python.org/2/library/logging.config.html#logging.config.fileConfig) – zvone

関連する問題