標準出力だけにログ出力することにして、もっとシンプルに書く。
ログフォーマットの種類の一覧のドキュメントが見つけにくいので、
ここに、リンクを→ 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()
これでロガーを作って使用する。