Pythonのlogging
モジュールを使用して、コンソールとファイルの両方にログを出力する方法を紹介します。
ロガーのセットアップ
まずは、logging
モジュールをインポートし、ロガーの基本設定を行います。以下のコードでは、StreamHandler
とFileHandler
の両方を使用して、コンソールとファイルにログを出力します。
import os
import sys
from datetime import datetime
import logging
from logging import StreamHandler, FileHandler, Formatter
from logging import INFO, DEBUG, NOTSET
# ストリームハンドラの設定
stream_handler = StreamHandler()
stream_handler.setLevel(INFO)
stream_handler.setFormatter(Formatter("%(message)s"))
# 保存先の有無チェック
if not os.path.isdir('./Log'):
os.makedirs('./Log', exist_ok=True)
# ファイルハンドラの設定
file_handler = FileHandler(f"./Log/log{datetime.now():%Y%m%d%H%M%S}.log")
file_handler.setLevel(DEBUG)
file_handler.setFormatter(Formatter("%(asctime)s@ %(name)s [%(levelname)s] %(funcName)s: %(message)s"))
logging.basicConfig(level=NOTSET, handlers=[stream_handler, file_handler])
ロガーの使用
ロガーを使用する場合は、logging.getLogger(__name__)
でロガーオブジェクトを取得して使用します。
logger = logging.getLogger(__name__)
logger.debug("debug")
logger.info("info")
logger.warn("warn")
logger.error("error")
logger.critical("critical")
以上の設定により、ファイルにはすべてのログが、コンソールにはinfo
からのログが出力されます。
注意点
logging.basicConfig()
で設定する出力レベルに注意が必要です。ログはルートロガー→ハンドラの順に渡されます。そのため、ルートロガーの設定であるlogging.basicConfig()
で出力レベルをINFO
等にしてしまうと、ルートロガーの時点で出力レベルがDEBUG
のログは弾かれてしまいます。
以上、Pythonでコンソールとファイルにログを出力する方法について説明しました。この情報が皆さんの開発に役立つことを願っています。