在我們使用log模組輸出日誌時,經常會遇到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.st程式設計客棧reamhandler()
sh.setformatter(format)
logger.addhandler(sh)
# 5 - 建立並新增handler - 檔案
fh = logging.filehandler('test.log')
fh.setformatter(format)
logger.addhandl程式設計客棧er(fh)
# 6 - 提供對外獲取logger
return logger
if __name__ == '__main__':
logger = log()
logger.info('使用函式定義的log方法')
我們在同一目錄下建立另外乙個檔案:
在我們匯入寫好的log.py檔案
from xx目錄 import log
log().info('***1')
log().info('***2')
log().info('***3')
輸出:這個結果什麼鬼?明明三句話,列印出來這麼多,這其實是log在使用的常遇到的坑,通過debug你會發現,每次呼叫都會建立控制代碼,所以重複,如圖:
第一句呼叫之後,handlers裡面已經存在了兩個handler,分別是控制台控制代碼streamhandler和檔案控制代碼filehandler,下面圖中是第二句呼叫新增控制代碼
執行後會發ycruh現handlers裡面多了乙個streamhandler
怎麼解決這種情況,有兩個方案,咱們分別列出兩種方案**:
第一種,第一使用單例模式,在log.py檔案中增加一行:logger = log() ,這句的作用就是提前例項化好物件,其他模組使用都適用該物件,所以別的模組匯入語句要改成:from ***包.log import logger ,然後使用logger.info('***x') 輸出日誌即可
……省略上方**
# 6 - 提供對外獲取logg的方法
return logger
#增加一行
logger = log()
if __name__ == '__main__':
logger = log()
logger.info('使用函式定義的log方法')
匯入:from xx包 import logger
logger.info('***1')
logger.info('***2')
logger.info('***3')
輸出:第二個方案: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__':
&www.cppcns.comnbsp; logger = log()
logger.info('使用函式定義的log方法')
匯入檔案**保持不變:
from xx包 import log
log().info('***1')
log程式設計客棧().info('***2')
log().info('***3')
輸出:針對物件導向的方案同樣是以上兩個,請自行解決
總結
python控制台log輸出儲存
日誌輸出與儲存 import logging import time from logging import handlers class logger object level relations 日誌級別關係對映 def init self,level info when d backcount...
JS控制台列印
今天在看jq的 時看到這樣乙個 console.warn nothing selected,can t validate,returning nothing 單獨執行,居然在控制台列印出了nothing selected,can t validate,returning nothing,豁然開朗,既...
nodejs之控制台列印
直接輸出引號中的資訊 onsole.log log資訊 依次輸出所有字串 console.log s first second 輸出結果 first second 將物件轉換為普通字串後執行 console.log s guoyansi 輸出結果 guoyansi 將字串作為數值進行轉換 conso...