俺「loggingのloggerモジュールってどこでインスタンス化すればいいんですか?logger_util.pyとかですか?」
答え:Loggerオブジェクトは、もうある。
logging.getLogger()を使ってLoggerオブジェクトを取得する。これにより、新しいLoggerを作成するのではなく、既存のLoggerを取得するか、必要に応じて新しいLoggerを生成する。
loggingは1つのpython.exeに対して1人のみ存在する
自分のPythonのloggingの認識や使い方が誤っていたので、メモ。
正解例
- 宣言の一例(basicConfigを指定して、簡単なフォーマットだけしたい)
import logging
# Loggingの初期化
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
もっと詳しい制御をやりたいときはyamlファイルで指定することになる。
フォーマットのみしたい、とか、そういう話ならこれでよさそう。
使用例
from logging import getLogger
logger = getLogger(__name__)
logger.info("ここにLog")
logging.info
とやるとルートLoggerさんが呼び出されてしまう。しかしloggingを単にインポートするだけだとやらかしがちなのであえてgetLoggerだけ使えるようにしておく。
ミスの原因
- よくわからないままloggingを便利モジュールとして使っていた(調べてみると、結構奥が深い話だった。)
- C#のいつもの慣習
普段、C#での開発ではログの出力用のクラスを、program.csあたりでインスタンス化し、使用していた。この感覚でPythonのロギングをしようとしていたので、失敗した。 - ChatGPTがこのトピックについてさほど詳しくない
Pythonのロギングは出るようにするだけなら割と正しくなくても動くため、あたかも実装できたかのように見えてしまう。こっちがミスったまま出力をお願いしてるとヘンな出し方をする。
参考
Logging HOWTO
公式のチュートリアルだがやや難しい。
ログ出力のための print と import logging はやめてほしい
とても詳しい。
Pythonのloggingをイメージで理解する【Python Logging徹底解説】
Loggingがこのプロジェクトだけではなく全体で動いていることがとても分かりやすい。
Pythonでprintを卒業してログ出力をいい感じにする
端的でわかりやすい。
※本記事はQmonus Value Streamの投稿キャンペーン記事です。