私たちが開発している Python アプリケーションには、ロガーが必要です。同僚は、ロガーを使用しているすべてのクラスでロガーを作成して構成する必要があると主張しています。私の意見では、アプリケーションの起動時に作成および構成し、コンストラクターパラメーターとして渡す必要があります。
どちらのバリアントにもメリットがあり、ベスト プラクティスが何であるかはわかりません。
多分これはあなたがアイデアを得るのに役立ちますか?もちろん、構成ファイルなどから設定を読み取って、より良くすることができますが、これは簡単な例です。
ロギングを構成する別のモジュール: mylogmod.py
:
import logging
FILENAME = "mylog.log" # Your logfile
LOGFORMAT = "%(message)s" # Your format
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production
LEVELS = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'critical':logging.CRITICAL}
def startlogging(filename=FILENAME, level=DEFAULT_LEVEL):
logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT)
main.py
:_
import logging
from mylogmod import startlogging
from myclass import MyClass
startlogging()
logging.info("Program started...")
mc = MyClass()
myclass.py
セルフテスト付きのモジュールからのクラス。単体テストで同様のことを行うことができます: (単体テストでロギング モジュールをインポートする必要がないことに注意してくださいstartlogging
。関数だけで十分です。この方法で、デフォルト レベルを警告またはエラーに設定し、単体テストと自己テストを実行できます。デバッグする)
import logging
class MyClass(object):
def __init__(self):
logging.info("Initialze MyClass instance...")
if __name__ == "__main__":
from mylogmod import startlogging
startlogging(level="debug")
logging.debug("Test MyClass...")
#... rest of test code...
パラメータとしてロガーを渡すのは良い考えではないと思います。グローバルロガーを独自のモジュールと見なす必要があります。それが最善のアイデアです。例:
logger.py
import logging
log = logging.getLogger('')
classFoo.py
form logger import log
log.debug('debug message')
classBar.py
form logger import log
log.warn('warn!')