1. ホーム
  2. python

[解決済み] Pythonのloggingモジュールを使用するとログが重複して出力される

2022-04-28 12:48:44

質問

Pythonのloggerを使用しています。以下は私のコードです。

import os
import time
import datetime
import logging
class Logger :
   def myLogger(self):
      logger = logging.getLogger('ProvisioningPython')
      logger.setLevel(logging.DEBUG)
      now = datetime.datetime.now()
      handler=logging.FileHandler('/root/credentials/Logs/ProvisioningPython'+ now.strftime("%Y-%m-%d") +'.log')
      formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
      handler.setFormatter(formatter)
      logger.addHandler(handler)
      return logger

問題は、ログファイルに、それぞれの logger.info を呼び出します。どうすれば解決できますか?

どのように解決するのですか?

その logging.getLogger() は、与えられた名前に対して同じインスタンスを返します。 ( ドキュメンテーション )

を呼び出すたびに myLogger() の場合、インスタンスに別のハンドラを追加しているため、ログが重複してしまうのです。

おそらくこのようなものでしょうか?

import os
import time
import datetime
import logging

loggers = {}

def myLogger(name):
    global loggers
    
    if loggers.get(name):
        return loggers.get(name)
    else:
        logger = logging.getLogger(name)
        logger.setLevel(logging.DEBUG)
        now = datetime.datetime.now()
        handler = logging.FileHandler(
            '/root/credentials/Logs/ProvisioningPython' 
            + now.strftime("%Y-%m-%d") 
            + '.log')
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        loggers[name] = logger
                       
        return logger