web-dev-qa-db-ja.com

Python Logging-ルートロガーレベルとハンドラーを継承する方法

私はpython初心者です。コードへのログインを実装しようとしています。2つのモジュールがあります。

main.py submodule.py

main.py

import logging
from logging.handlers import RotatingFileHandler
import submodule


import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()

submodule.py

import logging
from logging.handlers import RotatingFileHandler


def loggerCall():
    logger = logging.getLogger(__name__)
#    logger.setLevel(logging.DEBUG)

    fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')

    return

サブモジュールからgetLoggerを呼び出す限り、ルートロガーからログレベルとハンドラーの詳細を継承する必要があると思いました。ただし、私の場合、サブモジュールでログレベルとハンドラーを再度指定して、同じログファイルに出力する必要があります。

また、サブモジュール内に多くのメソッドとクラスがある場合。ログレベルとハンドラーを再度定義することなく、どうすればそれを実行できますか?.

メインモジュールで設定されたログレベルに基づいて、メインモジュールとサブモジュールが同じログに出力する単一のログファイルを作成するのが理想です。

事前に感謝

申し訳ありませんが、これは重複した質問である可能性があり、同様の質問を繰り返しましたが、これがどのように機能するか理解できませんでした。したがって、この質問を投稿します。私は意図的に複製bczを作成していません。それを検索しませんでした

10
Dvusrgme

ここでの問題は、ルートロガーを初期化していないことです。メインモジュールのロガーを初期化しています。

Main.pyでこれを試してください:

_import logging
from logging.handlers import RotatingFileHandler
import submodule

logger = logging.getLogger()  # Gets the root logger
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()
_

次に、submodule.pyでこれを試してください。

_def loggerCall():
    logger = logging.getLogger(__name__)
    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')
    return
_

すべてのサブモジュールから同じ場所にログメッセージを送信する必要があると述べたので、ルートロガーを初期化してから、メッセージロギングメソッドを(必要に応じてsetlevel()呼び出しとともに)使用する必要があります。サブモジュールには明示的なハンドラーがないため、logging.getLogger(__name__)はツリーをルートに移動し、main.pyで確立したハンドラーを見つけます。

12
GLRoman