2
1
sponsored by Qmonus Value Stream アプリケーション開発に注力するための工夫をシェアしよう!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Python】俺「loggingのloggerモジュールってどこでインスタンス化すればいいんですか?logger_util.pyとかですか?」

Last updated at Posted at 2024-06-27

俺「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の投稿キャンペーン記事です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1