概要
GoogleColab上でloggingを含むコードを複数回実行すると同一のログが重複して出力される。
全く同じ内容のログで不要なので出力されないようにする。
コード(変更前)
from logging import StreamHandler, Formatter, INFO, getLogger
handler = StreamHandler()
handler.setLevel(INFO)
handler.setFormatter(Formatter("[%(asctime)s] [%(threadName)s] %(message)s"))
logger = getLogger()
logger.addHandler(handler)
logger.setLevel(INFO)
...
こんな感じのコードがあったとする。
これを複数回実行すると重複して出力されてしまう。
logger.addHandler
を実行するとハンドラが logger.handlers
変数に格納される。
handlers
は、「同じハンドラは2重登録しない」ようになっているが、別のハンドラインスタンスを作成してaddHandlerに渡した場合、「違うハンドラ」なので登録されてしまうらしい。
コード(変更後)
from logging import StreamHandler, Formatter, INFO, getLogger
handler = StreamHandler()
handler.setLevel(INFO)
handler.setFormatter(Formatter("[%(asctime)s] [%(threadName)s] %(message)s"))
logger = getLogger()
for h in logger.handlers[:]:
logger.removeHandler(h)
h.close()
logger.addHandler(handler)
logger.setLevel(INFO)
...
一番簡単な対処方法はlogger.handlers
をaddHandler
前に初期化してしまうこと。
これで複数回出力はされなくなる。