ログが再起動のたびに増えていくバグと、運命の出会いを果たしたのでメモします。
Pythonのログの取り方をお勉強しました
以下の記事で、ログの取り方について学びました。
ログ出力のための print と import logging はやめてほしい
超絶的に雑な解釈ですが、以下のようなものだと理解しました
- print → エラーなのか警告なのかログなのか分からない。ログとる際に使うべきでない
- logging → グローバル変数的な立ち位置。
- logger → ローカル変数的な立ち位置。
※詳しくは元記事を参考にしてください・・・。
お、同じログがいっぱいでるぞ~
以下の記事で解決
再実行するたびにログが増えていく
上記の記事のようなログ用モジュールを作成して、実行する。
超具体的には、Anacondaで環境構築して、SpyderをIDEとして利用しており、 実行時にF5を使用すると、実行のたびにどんどん増える
# 一回目
[log info] ログテスト
# 二回目
[log info] ログテスト
[log info] ログテスト
#三回目
[log info] ログテスト
[log info] ログテスト
[log info] ログテスト
解決策
終了時に、killLoggers()
のようにハンドラを全削除してあげます
from logging import getLogger, Formatter, FileHandler,StreamHandler, DEBUG, shutdown from logging.handlers import RotatingFileHandler loggers = {} def getModuleLogger(moduleName): if moduleName is None: moduleName = __name__ if loggers.get(moduleName): return loggers.get(moduleName) formatter = Formatter('[%(asctime)s | ' '%(name)s | ' '%(levelname)s] ' '%(message)s') streamHandler = StreamHandler() streamHandler.setFormatter(formatter) streamHandler.setLevel(DEBUG) fileHandler = RotatingFileHandler("download.log", maxBytes=5000, backupCount=3) fileHandler.setFormatter(formatter) fileHandler.setLevel(DEBUG) logger = getLogger(moduleName) logger.setLevel(DEBUG) logger.addHandler(streamHandler) logger.addHandler(fileHandler) logger.propagate = False loggers[moduleName] = logger return logger def killLoggers(): for l in loggers: logger = loggers.get(l) for h in logger.handlers: logger.removeHandler(h) shutdown() return
これで重複出力はなくなります。
以上。