在做接口自動化,使用logging模塊打印日志時,遇到一個坑:第一次調用打印一次,第二次調用打印兩次,第三次調用打印三次。。。
修改前:
def log(msg):
logger = logging.getLogger("App")
handler = logging.FileHandler('test.log')
logger.setLevel(logging.INFO) #設置日志等級
# 日志輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 輸入到控制台
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
logger.info(msg)
一開始以為是logging.getLogger()多次實例化的問題,於是乎對logging.getLogger()寫了一個單例,但是問題仍然沒有解決。
原來logging的打印是由handler進行處理的,第一次調用時添加了handler,第二次調用又添加了一個handler,所以,這個logger里有了兩個同樣的handler,以此類推,調用幾次就會有幾個handler。。。
解決辦法:打印日志后,通過removeHandler()將處理器移除掉。
修改后:
def log(msg):
logger = logging.getLogger("App")
handler = logging.FileHandler('test.log')
logger.setLevel(logging.INFO) #設置日志等級
# 日志輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 輸入到控制台
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
logger.info(msg)
#移除處理器
logger.removeHandler(handler)
logger.removeHandler(console)
