這篇文章主要講解了“python如何解決控制臺打印log輸出重復問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python如何解決控制臺打印log輸出重復問題”吧!
先來看這個文件log.py的代碼:
代碼示例:
'''
功能描述:實現控制臺和文件同時記錄日志的功能
編寫人:超哥
編寫日期:
步驟分析:
1-配置日志記錄器名稱
2-配置日志級別
3-配置日志格式(可以分別設置,也可以統一設置)
4-創建并添加handler-控制臺
5-創建并添加handler-文件
6-提供對外獲取logger
'''
import logging
import sys
def log():
# 1 - 配置日志記錄器名稱
logger = logging.getLogger('AutoTest')
# 2-配置日志級別
logger.setLevel(logging.DEBUG)
# 3-配置日志格式(可以分別設置,也可以統一設置)
format = logging.Formatter('%(name)s-%(asctime)s-%(message)s')
# 4 - 創建并添加handler - 控制臺
sh = logging.StreamHandler()
sh.setFormatter(format)
logger.addHandler(sh)
# 5 - 創建并添加handler - 文件
fh = logging.FileHandler('test.log')
fh.setFormatter(format)
logger.addHandler(fh)
# 6 - 提供對外獲取logger
return logger
if __name__ == '__main__':
logger = log()
logger.info('使用函數定義的log方法')我們在同一目錄下創建另外一個文件:
在我們導入寫好的log.py文件
from xx目錄 import log
log().info('xxx1')
log().info('xxx2')
log().info('xxx3')第一句調用之后,handlers里面已經存在了兩個handler,分別是控制臺句柄StreamHandler和文件句柄FileHandler,下面圖中是第二句調用添加句柄
執行后會發現handlers里面多了一個StreamHandler
怎么解決這種情況,有兩個方案,咱們分別列出兩種方案代碼:
第一種,第一使用單例模式,在log.py文件中增加一行:logger = log() ,這句的作用就是提前實例化好對象,其他模塊使用都適用該對象,所以別的模塊導入語句要改成:from xxx包.log import logger ,然后使用logger.info('xxxx') 輸出日志即可
……省略上方代碼
# 6 - 提供對外獲取logg的方法
return logger
#增加一行
logger = log()
if __name__ == '__main__':
logger = log()
logger.info('使用函數定義的log方法')導入:
from xx包 import logger
logger.info('xxx1')
logger.info('xxx2')
logger.info('xxx3')輸出:

第二個方案:log.py每次判斷handlers是否已存在
……
# 4 - 創建并添加handler - 控制臺
sh = logging.StreamHandler()
sh.setFormatter(format)
# 5 - 創建并添加handler - 文件
fh = logging.FileHandler('test.log')
fh.setFormatter(format)
#在新增handler時判斷是否為空
if not logger.handlers:
logger.addHandler(sh)
logger.addHandler(fh)
# 6 - 提供對外獲取logg的方法
return logger
if __name__ == '__main__':
logger = log()
logger.info('使用函數定義的log方法')導入文件代碼保持不變:
from xx包 import log
log().info('xxx1')
log().info('xxx2')
log().info('xxx3')感謝各位的閱讀,以上就是“python如何解決控制臺打印log輸出重復問題”的內容了,經過本文的學習后,相信大家對python如何解決控制臺打印log輸出重復問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。