[複数のモジュールでのログ記録の使用]

PYTHON3 チュートリアル

複数のモジュールでのログ記録の使用方法について

ログ記録は、ソフトウェア開発において非常に重要な役割を果たします。特に複数のモジュールで構成された大規模なプロジェクトでは、各モジュールがどのように動作しているかを把握するために、適切なログ記録が必要です。この記事では、Pythonを用いた複数のモジュールでのログ記録の方法について解説し、具体的なコード例を示します。

Pythonのloggingモジュールの基本

Pythonには標準ライブラリとしてloggingモジュールが用意されており、これを使うことで簡単にログを記録することができます。基本的な使い方としては、loggerオブジェクトを取得し、ログレベルを設定してメッセージを記録します。以下に基本的な例を示します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import logging
# ロガーを取得
logger = logging.getLogger(__name__)
# ログレベルを設定
logger.setLevel(logging.DEBUG)
# コンソールハンドラを作成
ch = logging.StreamHandler()
# フォーマッタを作成
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# ハンドラにフォーマッタを設定
ch.setFormatter(formatter)
# ロガーにハンドラを設定
logger.addHandler(ch)
# ログメッセージを記録
logger.debug('これはデバッグメッセージです')
logger.info('これは情報メッセージです')
logger.warning('これは警告メッセージです')
logger.error('これはエラーメッセージです')
logger.critical('これは重大なメッセージです')
import logging # ロガーを取得 logger = logging.getLogger(__name__) # ログレベルを設定 logger.setLevel(logging.DEBUG) # コンソールハンドラを作成 ch = logging.StreamHandler() # フォーマッタを作成 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # ハンドラにフォーマッタを設定 ch.setFormatter(formatter) # ロガーにハンドラを設定 logger.addHandler(ch) # ログメッセージを記録 logger.debug('これはデバッグメッセージです') logger.info('これは情報メッセージです') logger.warning('これは警告メッセージです') logger.error('これはエラーメッセージです') logger.critical('これは重大なメッセージです')
import logging

# ロガーを取得
logger = logging.getLogger(__name__)

# ログレベルを設定
logger.setLevel(logging.DEBUG)

# コンソールハンドラを作成
ch = logging.StreamHandler()

# フォーマッタを作成
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# ハンドラにフォーマッタを設定
ch.setFormatter(formatter)

# ロガーにハンドラを設定
logger.addHandler(ch)

# ログメッセージを記録
logger.debug('これはデバッグメッセージです')
logger.info('これは情報メッセージです')
logger.warning('これは警告メッセージです')
logger.error('これはエラーメッセージです')
logger.critical('これは重大なメッセージです')

上記のコードは、コンソールに対してログメッセージを出力します。フォーマッタを使ってログの書式を設定することで、出力されるログの形式をカスタマイズできます。

複数のモジュールでのログ記録の設定

プロジェクトが複数のモジュールに分かれている場合、各モジュールで個別にログを設定することができます。以下に、複数のモジュールでのログ記録の設定方法を示します。

モジュール1: module1.py

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# module1.py
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
def function1():
logger.info('module1: function1が呼び出されました')
# module1.py import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) def function1(): logger.info('module1: function1が呼び出されました')
# module1.py
import logging

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

def function1():
    logger.info('module1: function1が呼び出されました')

モジュール2: module2.py

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# module2.py
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
def function2():
logger.debug('module2: function2が呼び出されました')
# module2.py import logging logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) def function2(): logger.debug('module2: function2が呼び出されました')
# module2.py
import logging

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

def function2():
    logger.debug('module2: function2が呼び出されました')

メインモジュール: main.py

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# main.py
import logging
import module1
import module2
# 共通のフォーマッタを設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# コンソールハンドラを作成
ch = logging.StreamHandler()
ch.setFormatter(formatter)
# ルートロガーにハンドラを追加
logging.getLogger().addHandler(ch)
# 各モジュールの関数を呼び出し
module1.function1()
module2.function2()
# main.py import logging import module1 import module2 # 共通のフォーマッタを設定 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # コンソールハンドラを作成 ch = logging.StreamHandler() ch.setFormatter(formatter) # ルートロガーにハンドラを追加 logging.getLogger().addHandler(ch) # 各モジュールの関数を呼び出し module1.function1() module2.function2()
# main.py
import logging
import module1
import module2

# 共通のフォーマッタを設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# コンソールハンドラを作成
ch = logging.StreamHandler()
ch.setFormatter(formatter)

# ルートロガーにハンドラを追加
logging.getLogger().addHandler(ch)

# 各モジュールの関数を呼び出し
module1.function1()
module2.function2()

この例では、main.pyがルートロガーにハンドラを追加し、共通のフォーマッタを設定しています。各モジュールはそれぞれのロガーを持っており、設定されたレベルに応じてログを記録します。これにより、プロジェクト全体で一貫したログ記録が可能になります。

ログの出力結果

上記のコードを実行すると、以下のようなログ出力が得られます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
2023-10-01 12:00:00,000 - module1 - INFO - module1: function1が呼び出されました
2023-10-01 12:00:00,001 - module2 - DEBUG - module2: function2が呼び出されました
2023-10-01 12:00:00,000 - module1 - INFO - module1: function1が呼び出されました 2023-10-01 12:00:00,001 - module2 - DEBUG - module2: function2が呼び出されました
2023-10-01 12:00:00,000 - module1 - INFO - module1: function1が呼び出されました
2023-10-01 12:00:00,001 - module2 - DEBUG - module2: function2が呼び出されました

この出力から分かるように、各モジュールのログが一貫したフォーマットで記録され、どのモジュールからのログであるかが明確に示されています。

結論

複数のモジュールでログ記録を行う際には、各モジュールで個別にロガーを設定し、共通のハンドラとフォーマッタを使用することで、一貫性のあるログ出力を実現できます。これにより、開発者は効率的にデバッグを行い、システムの動作を追跡することが可能です。

複数のモジュールでのログ記録の使用は、ソフトウェア開発プロセスにおいて重要な概念です。複数のモジュールが連携して動作する場合、それぞれのモジュールが生成するログを統合して記録することで、システム全体の動作をトラッキングしやすくなります。ログ記録は、デバッグやトラブルシューティング、パフォーマンスのモニタリングなどに役立ちます。適切なログ記録の設計と実装により、システムの安定性や保守性を向上させることができます。

購読
通知


0 Comments
Inline Feedbacks
View all comments