再考、Python のロギング

標準出力だけにログ出力することにして、もっとシンプルに書く。
ログフォーマットの種類の一覧のドキュメントが見つけにくいので、
ここに、リンクを→ https://docs.python.org/ja/3/library/logging.html

以下、過去に書いたのは、浅はかだった。
Python ログ、標準の logging - Oboe吹きプログラマの黙示録
Python ログ出力 logging iniファイルを使用しない - Oboe吹きプログラマの黙示録

import logging
from logging import Formatter, StreamHandler, getLogger, DEBUG

class Logger:
    def __init__(self):
        self.logger = getLogger()
        self.logger.setLevel(DEBUG)
        if len(self.logger.handlers) > 0:
            return
        formatter = Formatter(
            fmt="%(asctime)s.%(msecs)03d[%(levelname)7s][%(processName)s:%(threadName)s][%(filename)s][%(funcName)s:line %(lineno)d] %(message)s",
            datefmt = "%Y-%m-%d %H:%M:%S"
        )
        handler = StreamHandler()
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    def getLogger(self)->logging.Logger:
        return self.logger

ハンドラが既に存在するのに、 addHandler で追加してしまうとその分、同じログが出てしまう。
だから、

        if len(self.logger.handlers) > 0:
            return

これで抑制している。
ハンドラ remove や置き換えのメソッドが標準の Logger に
用意されてはいないので、
後勝ち設定にするには、addHandler を使わずに、以下の様に直接リストを置き換えれば良い。

        self.logger.handlers = [handler]

フォーマットの %(filename)s 
呼び出し側 Python スクリプトのファイル名である。同じファイル名がそこらかしこに存在して困るなら、
長くなっても、%(pathname)s で、フルパス出力するしかない。

(使い方)

logger = Logger().getLogger()

これでロガーを作って使用する。