Python logging モジュール

プログラミングにおいて、ログ記録(logging)は非常に重要なツールであり、プログラムの実行状態の追跡、エラーのデバッグ、重要な情報の記録に役立ちます。

Python には組み込みのlogging`logging` モジュールがあり、ログ記録タスクの処理に特化しています。単純なprint`print` ステートメントと比較して、logging`logging` モジュールはより柔軟で強力であり、さまざまなシナリオにおけるログのニーズを満たすことができます。

なぜ logging モジュールを使うのか?

  1. 柔軟性:logging`logging` モジュールを使用すると、必要に応じてログのレベル、フォーマット、出力先を設定できます。
  2. 拡張性:ログをファイル、コンソール、ネットワークなどのさまざまな出力先に簡単に出力できます。
  3. 構造化ログ:logging`logging` モジュールは構造化ログ記録をサポートしており、その後の分析や処理に便利です。
  4. パフォーマンス最適化:`print` とprint比較して、logging`logging` モジュールはパフォーマンスが最適化されており、本番環境での使用に適しています。

logging モジュールの基本用法

1. logging モジュールをインポートする

まず、インポートする必要があるのはlogging`logging` モジュールです:

例

import logging

2. ログレベルを設定する

ログレベルは、ログの詳細度を制御するために使用されます。logging`logging` モジュールは以下のログレベルを提供しています:

  • DEBUG:詳細なデバッグ情報で、通常は開発段階で使用されます。
  • INFO:プログラムが正常に動作しているときの情報です。
  • WARNING:潜在的な問題を示しますが、プログラムは引き続き正常に動作します。
  • ERROR:プログラム内のエラーを示し、一部の機能が正常に動作しなくなります。
  • CRITICAL:重大なエラーを示し、プログラムがクラッシュする可能性があります。

次のコードでログレベルを設定できます:

例

logging.basicConfig(level=logging.DEBUG)

3. ログを記録する

ログレベルを設定したら、次のメソッドを使用してログを記録できます:

例

logging.debug(これはデバッグ情報です)
logging.info(これは通常の情報です)
logging.warning(これは警告情報です)
logging.error(これはエラー情報です)
logging.critical(これは重大なエラー情報です)

4. ログ出力フォーマット

`basicConfig` メソッドをbasicConfig使用してログの出力フォーマットをカスタマイズできます。例:

例

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

5. ログをファイルに出力する

デフォルトでは、ログはコンソールに出力されます。ログをファイルに保存したい場合は、次のように設定します:

例

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    filename="app.log"
)

logging モジュールの上級用法

1. 複数のロガーを使用する

大規模なプロジェクトでは、異なるモジュールやコンポーネントごとに独立したロガーを作成する必要があるかもしれません。次のようにして実現できます:

例

logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)

# ファイルハンドラーを作成
file_handler = logging.FileHandler("my_logger.log")
file_handler.setLevel(logging.DEBUG)

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

# ログフォーマットを設定
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

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

# ログを記録
logger.debug(これはデバッグ情報です)
logger.info(これは通常の情報です)

2. ログフィルター

フィルターを使用して、どのログを記録する必要があるかを制御できます。例:

例

class MyFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR

logger.addFilter(MyFilter())

3. ログローテーション

ログファイルが大きくなりすぎた場合は、`RotatingFileHandler` を使用してRotatingFileHandler 或 TimedRotatingFileHandlerログローテーションを実装できます:

例

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)

logging モジュールのよく使う属性とメソッド

1. コアクラス

类説明例
logging.Loggerロガー。ログメッセージを発行します(`logging.getLogger()` をlogging.getLogger(name)使用して取得)logger = logging.getLogger("my_logger")
logging.Handlerハンドラー。ログの出力先を決定します(ファイル、コンソールなど)handler = logging.FileHandler("app.log")
logging.Formatterフォーマッター。ログ出力のフォーマットを制御しますformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
logging.Filterフィルター。ログ記録をより細かく制御するために使用しますfilter = logging.Filter("module.name")

2. Logger オブジェクトのよく使うメソッド

メソッド説明例
logger.setLevel(level)ログレベルを設定します(例:logging.DEBUG、logging.INFO)logger.setLevel(logging.DEBUG)
logger.debug(msg)DEBUG レベルのログを記録しますlogger.debug("调试信息")
logger.info(msg)INFO レベルのログを記録しますlogger.info("程序启动")
logger.warning(msg)WARNING レベルのログを記録しますlogger.warning("磁盘空间不足")
logger.error(msg)ERROR レベルのログを記録しますlogger.error("操作失败")
logger.critical(msg)CRITICAL レベルのログを記録しますlogger.critical("系统崩溃")
logger.addHandler(handler)ハンドラーを追加しますlogger.addHandler(handler)
logger.addFilter(filter)フィルターを追加しますlogger.addFilter(filter)

3. Handler のよく使うタイプ

Handler タイプ説明例
StreamHandlerストリームに出力します(コンソールなど)handler = logging.StreamHandler()
FileHandlerファイルに出力しますhandler = logging.FileHandler("app.log")
RotatingFileHandlerファイルサイズに基づいてログを分割しますhandler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)
TimedRotatingFileHandler時間に基づいてログを分割しますhandler = logging.TimedRotatingFileHandler("app.log", when="midnight")
SMTPHandlerメールでログを送信しますhandler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log")

4. ログレベル(定数)

レベル数値説明
CRITICAL50重大なエラー。プログラムが継続して実行できない可能性があります
ERROR40エラー。ただしプログラムは引き続き実行可能です
WARNING30警告情報(デフォルトレベル)
INFO20プログラム実行情報
DEBUG10デバッグ情報
NOTSET0親ロガーのレベルを継承します

5. Formatter のよく使うフォーマットフィールド

フィールド説明出力例
%(asctime)sログ作成時刻2023-01-01 12:00:00,123
%(levelname)sログレベル名INFO
%(message)sログメッセージの内容プログラムの起動に成功しました
%(name)sロガー名my_logger
%(filename)sログを生成したファイル名app.py
%(lineno)dログを生成した行番号42
%(funcName)sログを生成した関数名main

6. クイック設定メソッド

メソッド説明例
logging.basicConfig()ログレベル、ハンドラー、フォーマットを一括設定します(通常はプログラムのエントリーポイントで呼び出します)logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')

よく使うパラメータ:

  • level:ルートロガーのレベルを設定します

  • filename:ファイルに出力します

  • filemode:ファイルモード(例:'w'上書き)

  • format:フォーマット文字列

  • datefmt:日付形式(例:"%Y-%m-%d %H:%M:%S")

例

1. 基本設定

例

import logging

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

# 使用
logger = logging.getLogger("my_app")
logger.info(プログラム起動)

2. 複数ハンドラーの複雑な設定

例

import logging

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

# コンソールハンドラー
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# ファイルハンドラー
file_handler = logging.FileHandler("debug.log")
file_handler.setLevel(logging.DEBUG)

# フォーマット設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# ハンドラーを追加
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 使用
logger.debug(デバッグ情報)  # ファイルにのみ書き込む
logger.warning(警告!)  # コンソールとファイルの両方に出力

3. ログ分割

例


from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "app.log", maxBytes=1e6, backupCount=3  # 各ファイル1MB、バックアップ3つを保持
)
logger.addHandler(handler)
その他の拡張