python控制台列印log輸出重複的解決方法

2022-09-29 13:36:13 字數 2570 閱讀 2872

在我們使用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...