Pythonのログ機能を徹底解説:loggingモジュールの使い方と実践テクニック

Pythonで開発を進める上で、ログ機能はアプリケーションの動作確認やトラブルシューティングに欠かせない存在です。この記事では、Python標準のloggingモジュールを使ったログ出力の基本から、実際の現場で役立つ設定・活用方法までをわかりやすく解説します。

Pythonのloggingモジュールとは?

loggingモジュールは、アプリケーション内で発生した情報やエラーを記録・管理するための標準ライブラリです。ログの出力先やフォーマット、出力レベルを柔軟にカスタマイズできるため、開発・運用の現場で広く利用されています。

ログレベルの種類と使い分け

loggingモジュールには5つの主要なログレベルが用意されています。これらを適切に使い分けることで、必要な情報だけを効率的に記録できます。

ログレベル数値主な用途
DEBUG10詳細なデバッグ情報
INFO20通常の動作や進捗の記録
WARNING30注意が必要な事象
ERROR40エラー発生時
CRITICAL50致命的な障害やシステム停止レベル

基本的なログ出力の実装例

最小限のログ出力

import logging

logging.basicConfig(level=logging.INFO)
logging.info('情報メッセージ')
logging.warning('警告メッセージ')

デフォルトではWARNING以上のログのみが表示されるため、INFOを出力したい場合はlevelを指定します。

モジュールごとにロガーを使う

from logging import getLogger

logger = getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.debug('デバッグメッセージ')

getLogger(name)を使うことで、モジュール単位でログ管理ができ、複数モジュールの大規模開発にも対応できます。

ハンドラーとフォーマッターの活用

ログの出力先や形式を柔軟に設定するには、ハンドラーとフォーマッターを活用します。

コンソールとファイル両方に出力する例

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# コンソール出力用ハンドラー
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)

# ファイル出力用ハンドラー
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)

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

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

logger.info('ファイルとコンソールに出力されます')

このように複数のハンドラーを設定することで、用途に応じたログ管理が可能です。

ログ設定の外部ファイル管理

複雑な設定や環境ごとの切り替えには、YAMLやiniファイルでログ設定を一元管理できます。

YAML設定例

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
  file:
    class: logging.FileHandler
    level: INFO
    formatter: simple
    filename: application.log
root:
  level: DEBUG
  handlers: [console, file]

この設定をlogging.config.dictConfig()で読み込むことで、柔軟なログ管理が実現できます。

ログ運用で気をつけたいポイント

Pythonでログを活用する際、ちょっとした工夫や気配りで運用がぐっと楽になります。

  • ロガーの階層構造を活用して、モジュールごとにログレベルや出力先を分けると、プロジェクトが大きくなっても管理しやすくなります。
  • 開発環境と本番環境でログの出力内容やレベルを切り替えるには、外部設定ファイルや環境変数を使うのがおすすめです。
  • 例外が発生したときはlogger.exception()を使うと、エラーの内容だけでなくトレースバックも自動で記録されるので、原因調査がとてもスムーズになります。
  • print文ではなくロガーを使うことで、時刻やモジュール名などの情報も自動で記録され、後から見返す時にも役立ちます。

まとめ

Pythonのloggingモジュールを活用すれば、アプリケーションの可視性や保守性が大きく向上します。ログレベル、ハンドラー、フォーマッターを上手に組み合わせて、プロジェクトや運用環境に合わせた最適なログ設計を目指してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村