見出し画像

Pythonロギング: loguru vs logging 🐍🐍


Python のロギングライブラリの比較:logging 対 loguru



1. Loguru がロギングを簡素化する

Python 開発において、ロギングは重要なツールです。開発者がプログラムの実行状態を記録し、問題をデバッグし、システムの健全性をモニタリングするのに役立ちます。Python には組み込みの `logging` ライブラリがあります。ただ、要件の変化に伴い、多くの人が `loguru` を代替として使用するようになりました。この記事では、この 2 つのライブラリを比較し、より適切なロギングソリューションを選択するのに役立てます。

`Loguru` は人気のあるサードパーティのロギングライブラリです。設定プロセスを簡素化し、チェーン呼び出しをサポートし、より豊富な機能を提供することで、`logging` の強力な代替となっています。

Loguru の利点

  • 簡単な設定:`Loguru` は複雑な設定を作成する必要がありません。数行のコードで複雑なロギング設定を完了できます。

  • チェーン呼び出し:チェーン呼び出しをサポートしており、ロギングがより直感的になります。

  • 複数ターゲット出力:コンソールとファイルの両方にロギング出力を簡単に実現でき、また豊富な形式設定もサポートしています。

  • 追加機能:自動ログ圧縮、ログファイル回転、ログ保持期間などの機能をサポートしています。

Loguru の基本的な例

from loguru import logger

# ロギング設定
logger.add("app.log", rotation="500 MB")  # ファイルが 500 MB を超えると自動的に回転します

# ログメッセージ
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")

この例では、追加で複数のハンドラを設定する必要がありません。`logger.add()` を呼び出すだけで簡単にファイルロギング設定を完了できます。

ファイルとコンソールの両方への出力

`Loguru` は非常に便利にファイルとコンソールの両方への出力を実現できます:

from loguru import logger
import sys

# ファイルとコンソールへのロギング出力を追加
logger.add("app.log", rotation="500 MB", retention="10 days")  # ファイル回転と 10 日間の保持
logger.add(sys.stdout, level="INFO")  # コンソールへの出力

# ログメッセージ
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")

ここで、`logger.add(sys.stdout, level="INFO")` は追加設定なしでコンソールにログを表示できます。

2. Python の組み込み logging の利点と欠点

利点

  • 標準ライブラリの一部:`logging` は Python の標準ライブラリの一部なので、追加のインストールが不要で、クロスプラットフォームで利用可能です。

  • 高度なカスタマイズ性:`logging` は強力なカスタマイズ機能を提供し、ログの形式、レベル、ターゲット(ファイル、コンソール、リモートサーバーなど)を柔軟に制御できます。

  • 強い互換性:多くのサードパーティのライブラリも `logging` を使用しており、様々なログをシームレスに統合できます。

欠点

  • 複雑な設定:`logging` の基本的な使用は比較的簡単ですが、やや複雑な設定になると、特に複数のターゲット(例えばファイルとコンソール)に同時に出力する必要がある場合、長くて直感的ではありません。

  • チェーン呼び出しなし:`logging` は `loguru` のようなチェーン呼び出しをサポートせず、層層設定する必要があります。

基本的な例

`logging` の簡単なロギング例は以下の通りです:

import logging

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

# ログメッセージ
logging.info("This is an info message.")
logging.warning("This is a warning message.")
logging.error("This is an error message.")

この例では、ログは `app.log` ファイルに記録されますが、コンソールには表示されません。コンソールとファイルの両方にログを表示するには、`StreamHandler` を追加で設定する必要があります。

ファイルとコンソールへの出力の設定

ログをコンソールとファイルの両方に出力するには、複数の `Handler` を設定する必要があります。コードは以下の通りです:

import logging

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

# ファイルハンドラ
file_handler = logging.FileHandler('app.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

# コンソールハンドラ
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

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

# ログメッセージ
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")

比較的単純な機能を実現するためにも、異なる `Handler` を作成し、1 つずつ設定する必要があることがわかります。

3. logging と loguru の詳細比較

|機能|logging|loguru|
| ---- | ---- | ---- |
|設定の複雑さ|高、Handlers を設定する必要がある|低、`logger.add()` のみで済む|
|ファイル回転と保持|サードパーティのモジュールのサポートが必要|`rotation` と `retention` を内蔵でサポート|
|コンソールとファイルへの同時出力|複数の Handlers を設定する必要がある|`sys.stdout` を使って簡単に実現可能|
|チェーン呼び出し|サポートしない|サポートする|
|使いやすさ|複雑な設定と統合に適している|迅速な開発と明快なログ管理に適している|

4. 推奨されるアプリケーションシナリオ

  • 単純なアプリケーションと迅速な開発:`Loguru` がより良い選択肢です。簡潔で直感的で、迅速なプロトタイピングや小規模なプロジェクトに適しています。

  • 複雑なアプリケーションと多モジュールプロジェクト:`logging` が提供する高度なカスタマイズ機能は、多段階の設定が必要な複雑なシステム、特にサードパーティのライブラリに依存し、ログ管理を統一したいプロジェクトにより適しています。

5. まとめ

`loguru` と `logging` の両方には利点と欠点があります。ほとんどの Python プロジェクトにおいて、`loguru` の簡潔な構文と強力な機能は迅速な開発において第一選択となります。より大規模なプロジェクトでは、標準ライブラリ `logging` の互換性と柔軟性がより適しています。この記事があなたのプロジェクトに適したロギングツールの選択に役立つことを願っています。

Leapcell: 最適な Web ホスティング用サーバレスプラットフォーム


最後に、Python アプリをデプロイする最適なプラットフォーム:Leapcell をおすすめします。

1. 多言語対応

  • JavaScript、Python、Go、または Rust で開発できます。

2. 無制限のプロジェクトを無料でデプロイ

  • 使用量に応じてのみ課金 — リクエストがなければ料金はかかりません。

3. 圧倒的なコスト効率

  • 使い捨て課金で、アイドル時の料金はかかりません。

  • 例:25 ドルで平均応答時間 60ms で 694 万回のリクエストをサポートできます。

4. ストリームライン化された開発者体験

  • 直感的な UI で簡単なセットアップが可能。

  • 完全自動化された CI/CD パイプラインと GitOps 統合。

  • アクション可能な洞察のためのリアルタイムメトリックとロギング。

5. 簡単なスケーラビリティと高性能

  • 高い同時実行数を簡単に処理できる自動スケーリング。

  • オペレーションのオーバーヘッドはゼロ — 構築に集中できます。



ドキュメントで詳細を探索!

Leapcell Twitter: https://x.com/LeapcellHQ

いいなと思ったら応援しよう!