[Python]loggingについて勉強したので汎用モジュールを作成

[Python]loggingについて勉強したので汎用モジュールを作成

今までprintで雑なログしか吐いたことがなく、そろそろこの非効率から脱したいと思い、これを機にインプットしました.
そもそもloggingとは何か、については他の良書に譲るとして(都度参考リンクを紹介していきます)、今回汎用的に使えるログ出力機能を作ったのでまとめます.

はじめに

インプットとして以下のサイトを読みました.

【Python】仕組みを理解してログ出力を使いこなす
https://hackers-high.com/python/logging-overview/
⇒「ログとはそもそも何か」から導入していて特にわかりやすかったです.

Pythonでprintを卒業してログ出力をいい感じにする
https://qiita.com/FukuharaYohei/items/92795107032c8c0bfd19

【Python】loggingを使ってログを出力する
https://www.rk-k.com/archives/3993

ロガーの生成

loggingの中核となる部分.
以下のように名前を付けて生成できる.
(「name」は「main」という名前になる)

※「from logging import getLogger 」としているのはlogging.info()の誤作動を避けるため. logging.info()はルートロガーに直接レコードを送るため他のロガーにも影響が出てしまう.

また、実際に出力する場合にはロガーに紐づくハンドラーを利用する.

ちなみにロガーは階層構造となっている.
生成されたロガーは親ロガーを伝播していき、最終的にはルートロガーにたどり着くが、途中でコンソール出力、ファイル出力に枝分かれさせたり、そもそも出力しないようにもできる.

ハンドラ

ログレコードを出力できる.
先ほど生成したロガーに紐づけ、ハンドラの内容に沿ったログレコードをそのロガーから取得します.

フォーマッタ

ハンドラが受け取ったログレコードをフォーマットする.

ログレベル

こんな感じで設定するとそれ以下のログレベルは処理されなくなる.

ログレベルの優先順位:
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

ログフロー

以下、公式のフローチャートを参照.
https://docs.python.org/ja/3/howto/logging.html#logging-flow

いざ作る

以上を踏まえて以下のようなlogger.pyを作成した.

実際に利用する際は以下のような感じで使用するクラスに記述する.

吐かせるログはこんな感じ.

終わりに

今回のインプットおよび汎用モジュール(logger.py)を作成したことで、全体的なコードが綺麗になったのはもちろん、理解度が深まったこともあって作業が円滑になったのが実感できる.
特にターミナルでは追えない、探すのも面倒なときもファイル出力しておけば容易に問題点のチェックもできる.(作ったプロジェクトに雑にこいつを忍ばせておけば心強い…はず)
正直、C#におけるVisualStudioやjavaやkotlinで利用するAndroidStudioなど、IDEが優秀なおかげ(主にデバッグ)で今まで気にもかけていなかったんですよね…よくない.
それでもpython触るようになってからこういった細かな点にも自然と手が伸びるようになるのは良いことですね.これからも精進します.