Python - ロギング
こんにちは、Pythonプログラマー志望の皆さん!今日は、Pythonのワンダフルなログの世界に飛び込んでいきましょう。あなたの親しみのある近所のコンピューター教師として、あなたをこの旅に案内することができて嬉しいです。信じてください、このチュートリアルの終わりまで行くと、あなたはプロのようにログを取ることができるようになります!
Pythonでのロギング
あなたがミステリーを解決するために探偵を演じていると想像してみてください。見つかったすべての手がかりを記録しようと思うでしょうか?そう、それがプログラミングでのロギングが行うことです!コードが実行されている間に、何が起こっているかを追跡するのを助けます。
Pythonには、このプロセスを簡単にするための組み込みのlogging
モジュールがあります。それは、重要な情報を自動的に記入してくれる信頼できるノートブックのようなものです。
ロギングの利点
今、あなたは「print文を使えば良いのにロギングをどうするの?」と思うかもしれません。素晴らしい質問です!私の初期のコーディング日のちょっとした物語をシェアしましょう。
私は一度、プログラムをデバッグするためにprint文を使って数時間を費やしました。それは、干草堆から針を見つけるようなものでした!そんなとき、私はロギングの魔法を発見しました。以下はその利点です:
- 柔軟性:print文とは異なり、コードを修正せずにログをオンまたはオフにすることができます。
- 深刻度レベル:ログをその重要性に基づいてカテゴリ分けすることができます。
- 出力制御:ログはファイル、コンソール、またはリモートサーバーに送ることができます!
- パフォーマンス:ロギングはprint文に比べてパフォーマンスに与える影響が少ないです。
Pythonロギングのコンポーネント
Pythonロギングの主要コンポーネントを分解してみましょう:
- ロガー:これらはロギングシステムへのエントリポイントです。
- ハンドラー:これらはログレコードを適切な目的地に送信します。
- フォーマッター:これらは最終出力中のログレコードのレイアウトを指定します。
- フィルター:これらは、どのログレコードを出力するかに対して追加の制御を提供します。
工場の組立ラインを想像してみてください。ロガーは問題を見つける労働者、ハンドラーはレポートをどこに送るかを決定し、フォーマッターはレポートがどのように見えるかを決定し、フィルターはどのレポートが十分に重要であるかを決定します。
ログレベル
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("クリティカルメッセージ")
この例では、以下のことを行いました:
- ロギングレベルをDEBUGに設定
- ログメッセージのフォーマットを指定
- 出力先を'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('これはクリティカルメッセージです')
この例では、以下のハンドラーを設定しました:
- StreamHandlerは、WARNING以上のメッセージをコンソールに出力
- FileHandlerは、ERROR以上のメッセージをファイルに保存
このコードを実行すると、コンソールにWARNING以上のメッセージが表示され、ファイルにはERROR以上のメッセージが保存されます。
それでは、皆さん!あなたはPythonロギングの世界に踏み込んだ第一歩をお取りしました。覚えておいてください、練習は完璧を作り出します。異なる設定を試して、あなたのプロジェクトに最も適したものを見つけてください。
幸せなロギングを、そして常にバグフリーのコードをお願いします!
Credits: Image by storyset