Python logging モジュール
プログラミングにおいて、ログ記録(logging)は非常に重要なツールであり、プログラムの実行状態の追跡、エラーのデバッグ、重要な情報の記録に役立ちます。
Python には組み込みのlogging`logging` モジュールがあり、ログ記録タスクの処理に特化しています。単純なprint`print` ステートメントと比較して、logging`logging` モジュールはより柔軟で強力であり、さまざまなシナリオにおけるログのニーズを満たすことができます。
なぜ logging モジュールを使うのか?
- 柔軟性:
logging`logging` モジュールを使用すると、必要に応じてログのレベル、フォーマット、出力先を設定できます。 - 拡張性:ログをファイル、コンソール、ネットワークなどのさまざまな出力先に簡単に出力できます。
- 構造化ログ:
logging`logging` モジュールは構造化ログ記録をサポートしており、その後の分析や処理に便利です。 - パフォーマンス最適化:`print` と
print比較して、logging`logging` モジュールはパフォーマンスが最適化されており、本番環境での使用に適しています。
logging モジュールの基本用法
1. logging モジュールをインポートする
まず、インポートする必要があるのはlogging`logging` モジュールです:
例
2. ログレベルを設定する
ログレベルは、ログの詳細度を制御するために使用されます。logging`logging` モジュールは以下のログレベルを提供しています:
- DEBUG:詳細なデバッグ情報で、通常は開発段階で使用されます。
- INFO:プログラムが正常に動作しているときの情報です。
- WARNING:潜在的な問題を示しますが、プログラムは引き続き正常に動作します。
- ERROR:プログラム内のエラーを示し、一部の機能が正常に動作しなくなります。
- CRITICAL:重大なエラーを示し、プログラムがクラッシュする可能性があります。
次のコードでログレベルを設定できます:
例
3. ログを記録する
ログレベルを設定したら、次のメソッドを使用してログを記録できます:
例
logging.info(これは通常の情報です)
logging.warning(これは警告情報です)
logging.error(これはエラー情報です)
logging.critical(これは重大なエラー情報です)
4. ログ出力フォーマット
`basicConfig` メソッドをbasicConfig使用してログの出力フォーマットをカスタマイズできます。例:
例
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
5. ログをファイルに出力する
デフォルトでは、ログはコンソールに出力されます。ログをファイルに保存したい場合は、次のように設定します:
例
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
filename="app.log"
)
logging モジュールの上級用法
1. 複数のロガーを使用する
大規模なプロジェクトでは、異なるモジュールやコンポーネントごとに独立したロガーを作成する必要があるかもしれません。次のようにして実現できます:
例
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. ログフィルター
フィルターを使用して、どのログを記録する必要があるかを制御できます。例:
例
def filter(self, record):
return record.levelno == logging.ERROR
logger.addFilter(MyFilter())
3. ログローテーション
ログファイルが大きくなりすぎた場合は、`RotatingFileHandler` を使用してRotatingFileHandler 或 TimedRotatingFileHandlerログローテーションを実装できます:
例
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. ログレベル(定数)
| レベル | 数値 | 説明 |
|---|---|---|
CRITICAL | 50 | 重大なエラー。プログラムが継続して実行できない可能性があります |
ERROR | 40 | エラー。ただしプログラムは引き続き実行可能です |
WARNING | 30 | 警告情報(デフォルトレベル) |
INFO | 20 | プログラム実行情報 |
DEBUG | 10 | デバッグ情報 |
NOTSET | 0 | 親ロガーのレベルを継承します |
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. 基本設定
例
# ログを設定
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. 複数ハンドラーの複雑な設定
例
# ロガーを作成
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)