Python - ロギング

こんにちは、Pythonプログラマー志望の皆さん!今日は、Pythonのワンダフルなログの世界に飛び込んでいきましょう。あなたの親しみのある近所のコンピューター教師として、あなたをこの旅に案内することができて嬉しいです。信じてください、このチュートリアルの終わりまで行くと、あなたはプロのようにログを取ることができるようになります!

Python - Logging

Pythonでのロギング

あなたがミステリーを解決するために探偵を演じていると想像してみてください。見つかったすべての手がかりを記録しようと思うでしょうか?そう、それがプログラミングでのロギングが行うことです!コードが実行されている間に、何が起こっているかを追跡するのを助けます。

Pythonには、このプロセスを簡単にするための組み込みのloggingモジュールがあります。それは、重要な情報を自動的に記入してくれる信頼できるノートブックのようなものです。

ロギングの利点

今、あなたは「print文を使えば良いのにロギングをどうするの?」と思うかもしれません。素晴らしい質問です!私の初期のコーディング日のちょっとした物語をシェアしましょう。

私は一度、プログラムをデバッグするためにprint文を使って数時間を費やしました。それは、干草堆から針を見つけるようなものでした!そんなとき、私はロギングの魔法を発見しました。以下はその利点です:

  1. 柔軟性:print文とは異なり、コードを修正せずにログをオンまたはオフにすることができます。
  2. 深刻度レベル:ログをその重要性に基づいてカテゴリ分けすることができます。
  3. 出力制御:ログはファイル、コンソール、またはリモートサーバーに送ることができます!
  4. パフォーマンス:ロギングはprint文に比べてパフォーマンスに与える影響が少ないです。

Pythonロギングのコンポーネント

Pythonロギングの主要コンポーネントを分解してみましょう:

  1. ロガー:これらはロギングシステムへのエントリポイントです。
  2. ハンドラー:これらはログレコードを適切な目的地に送信します。
  3. フォーマッター:これらは最終出力中のログレコードのレイアウトを指定します。
  4. フィルター:これらは、どのログレコードを出力するかに対して追加の制御を提供します。

工場の組立ラインを想像してみてください。ロガーは問題を見つける労働者、ハンドラーはレポートをどこに送るかを決定し、フォーマッターはレポートがどのように見えるかを決定し、フィルターはどのレポートが十分に重要であるかを決定します。

ログレベル

Pythonのロギングには、5つの標準的な深刻度レベルがあります。以下のテーブルで見てみましょう:

レベル 数値値 説明
DEBUG 10 詳細な情報、通常は問題を診断する際にのみ興味深いです。
INFO 20 期待通りに動作していることを確認します。
WARNING 30 予期しないことが起こった、または近い将来の問題を示している可能性があります。
ERROR 40 より深刻な問題により、ソフトウェアがいくつかの機能を実行できなかった。
CRITICAL 50 シリアスなエラー、プログラム自体が実行を続けることができない可能性があります。

基本的なロギング例

まず、簡単な例から始めてみましょう:

import logging

# 基本のロギングを設定
logging.basicConfig(level=logging.INFO)

# ロガーを作成
logger = logging.getLogger(__name__)

# メッセージをログに記録
logger.debug("これはデバッグメッセージです")
logger.info("これは情報メッセージです")
logger.warning("これは警告メッセージです")
logger.error("これはエラーメッセージです")
logger.critical("これはクリティカルメッセージです")

このコードを実行すると、以下のような出力が得られます:

INFO:__main__:これは情報メッセージです
WARNING:__main__:これは警告メッセージです
ERROR:__main__:これはエラーメッセージです
CRITICAL:__main__:これはクリティカルメッセージです

デバッグメッセージが表示されないことにお気づきでしょうか?それは、基本設定レベルをINFOに設定しているためです。INFOよりも低い(デバッグなど)は、設定を変更しない限りログに記録されません。

ロギングの設定

では、もう少しファンシーなロギング設定を見てみましょう:

import logging

# ロギングを設定
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("デバッグメッセージ")
logger.info("情報メッセージ")
logger.warning("警告メッセージ")
logger.error("エラーメッセージ")
logger.critical("クリティカルメッセージ")

この例では、以下のことを行いました:

  1. ロギングレベルをDEBUGに設定
  2. ログメッセージのフォーマットを指定
  3. 出力先を'app.log'というファイルに設定

'app.log'ファイルを確認すると、タイムスタンプ付きのよく整ったログメッセージが表示されます!

ロギングハンドラー

ハンドラーは、ロギングの世界での郵便局のような存在です。彼らは、あなたのログメッセージがどこに行くかを決定します。複数のハンドラーを使用する例を見てみましょう:

import logging

# ロガーを作成
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# ハンドラーを作成
c_handler = logging.StreamHandler()  # コンソールハンドラー
f_handler = logging.FileHandler('file.log')  # ファイルハンドラー
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# フォーマッターを作成し、ハンドラーに追加
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# ハンドラーをロガーに追加
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# ロガーをテスト
logger.debug('これはデバッグメッセージです')
logger.info('これは情報メッセージです')
logger.warning('これは警告メッセージです')
logger.error('これはエラーメッセージです')
logger.critical('これはクリティカルメッセージです')

この例では、以下のハンドラーを設定しました:

  1. StreamHandlerは、WARNING以上のメッセージをコンソールに出力
  2. FileHandlerは、ERROR以上のメッセージをファイルに保存

このコードを実行すると、コンソールにWARNING以上のメッセージが表示され、ファイルにはERROR以上のメッセージが保存されます。

それでは、皆さん!あなたはPythonロギングの世界に踏み込んだ第一歩をお取りしました。覚えておいてください、練習は完璧を作り出します。異なる設定を試して、あなたのプロジェクトに最も適したものを見つけてください。

幸せなロギングを、そして常にバグフリーのコードをお願いします!

Credits: Image by storyset