日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用logging模塊debug方法來調試代碼

作者:Nana8874 更新時間: 2022-07-30 編程語言

一般的小代碼,初學者可能會采取在適當的地方添加print()方法輸出信息來進行代碼的檢查和調試,但是如果代碼比較多,print()方法在調試完成后需要將所有的print()代碼都注釋或者刪除以使得調試輸出信息不再輸出,這對于大代碼非常不方便。因此最好不要養成使用print()語句調試的習慣,一開始就學習使用logging模塊debug方法來調試代碼。

python系統自帶logging模塊可以實現對代碼的運行追蹤的日志記錄功能,提供了便捷的代碼bug追蹤機制,不僅可以將日志打印出來,還可以將日志保存為文檔,便于保存與查看。開發人員可以對他們的代碼添加日志調用,借此來指示某事件的發生。一個事件通過一些包含變量數據的描述信息來描述(比如:每個事件發生時的數據都是不同的)。logging模塊還提供區分事件的重要性的不同級別:

級別 級別數值 使用時機
DEBUG 10 詳細信息,常用于調試。
INFO 20 程序正常運行過程中產生的一些信息。
WARNING 30 警告用戶,雖然程序還在正常工作,但有可能發生錯誤。
ERROR 40 由于更嚴重的問題,程序已不能執行一些功能了。
CRITICAL 50 嚴重錯誤,程序已不能繼續運行。

logging的默認的級別是WARNING,意味著只會追蹤該級別及以上的事件,DEBUG和INFO會被忽略,WARING、ERROR和CRITICAL會被記錄,除非更改日志配置。

一個簡單的將結果輸出到控制臺的語句為:

import logging
logging.warning('info level')  # WARNING:root:info levelb

有多種方法用來處理被跟蹤的事件。最簡單的方法就是把它們打印到終端控制臺上:

import logging
from logging import debug

logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level = logging.DEBUG)

def func(s):
    str1 = 'Loop'
    str2 = 'leap'
    debug(f's的數據類型為 {type(s)}, {s}')
    debug(f'{str1} before you {str2}')
    return s/10  
 
if __name__ == '__main__':
    func(100)

輸出結果為:

DEBUG:func:s的數據類型為 <class 'int'>, 100
DEBUG:func:Loop before you leap

basicConfig方法介紹

在使用過程中可以直接用logging.debug()來替換print()。如果程序調試好,可以通過修改level來控制debug info的輸出, eg:將以下這句的level = logging.DEBUG換為logging.INFO就可以了:

logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level = logging.INFO)

basicConfig方法中的format定義了日志信息中包含的信息的格式,變量是logging內置的keys:

屬性 格式 描述
asctime %(asctime)s 日志產生的時間,默認格式為2003-07-08 16:49:45,896
created %(created)f time.time()生成的日志創建時間戳
funcName %(funcName)s 調用日志的函數名
levelname %(levelname)s 日志級別 (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)
lineno %(lineno)d 日志所針對的代碼行號(如果可用的話)
module %(module)s 生成日志的模塊名
message %(message)s 具體的日志信息
name %(name)s 日志調用者

我們還可以通過basicConfig方法中的參數設置,將結果輸出到文件:

import logging
logging.basicConfig(filename='test.log', level=20)
logging.log(10, '級別為10的一條日志')
logging.log(20, '級別為20的一條日志')

上例中,通過basicConfig方法將日志輸出到test.log文件,并且設置只有級別大于等于20的才會寫入到該日志文件。也就是說,上例中,第一條級別為10的日志將不會寫入到文件。并且,需要注意的是,如果你查看日志文件,如果出現亂碼的話,請檢查編碼方式。

上例中,在basicConfig方法中,級別20也可以這樣指定:

logging.basicConfig(filename='test.log', level=logging.INFO) 
logging.debug('debug level: 10')
logging.info('info level: 20')
logging.warning('warning level: 30')
logging.error('error level: 40')
logging.critical('critical level: 50')

上例中同樣只有級別大于等于20的將會被寫入文件test.log。

basicConfig方法還可以指定一下參數:

  • filemode,日志文件寫入方式,可以是w和a,默認的是a模式。
  • datefmt,指定時間的輸出格式。
  • level,指定日志輸出的類別,程序會輸出大于等于此級別的信息。
  • stream,在沒有指定filename的時候會默認使用StreamHandler,這時stream可以指定初始化的文件流。
  • handlers:可以指定日志處理時所使用的 Handlers,必須是可迭代的。

示例:

import logging
logging.basicConfig(
    filename='test.log',
    filemode='w',
    level=logging.DEBUG,
    datefmt='%Y/%m/%d %H:%M:%S',
    format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s'
)
logging.debug('debug level: 10')
logging.info('info level: 20')
logging.warning('warning level: 30')
logging.error('error level: 40')
logging.critical('critical level: 50')

輸出結果為:

2019/05/30 14:38:09 - root - DEBUG - 36 - 日志模塊 - debug level: 10
2019/05/30 14:38:09 - root - INFO - 37 - 日志模塊 - info level: 20
2019/05/30 14:38:09 - root - WARNING - 38 - 日志模塊 - warning level: 30
2019/05/30 14:38:09 - root - ERROR - 39 - 日志模塊 - error level: 40
2019/05/30 14:38:09 - root - CRITICAL - 40 - 日志模塊 - critical level: 50

需要注意的是,logging.basicConfig只生效一次,比如:
···
import logging
logging.basicConfig(
filename=‘test1.log’,
filemode=‘w’,
level=logging.DEBUG
)

無效

logging.basicConfig(
filename=‘test2.log’,
filemode=‘a’,
level=logging.INFO
)

logging.debug(‘debug level: 10’)
logging.info(‘info level: 20’)
logging.warning(‘warning level: 30’)
logging.error(‘error level: 40’)
logging.critical(‘critical level: 50’)
···
正如上例所示,我們配置了兩次basicConfig。但如果運行你會發現,只有第一個配置生效了,第二個配置不會生效。原因是當在第一次配置的時候,logging在內部就會進行配置,第二次再次配置的時候,logging就會認為我已經配置好了,不需要再次配置了。

Debug 簡易使用

首先使用logging.getLogger()進行配置,參數為文件名,通過logger.setLevel()設置logger的級別:

import logging

# 配置logger并設置等級為DEBUG
logger = logging.getLogger('logging_debug')
logger.setLevel(logging.DEBUG)

然后使用logging.StreamHandler()方法初始化consoleHandler,通過consoleHandler.setLevel()設置級別:

# 配置控制臺Handler并設置等級為DEBUG
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)

再通過logger.addHandler()方法將consoleHandler加入logger,完成logger的配置:

logger.addHandler(consoleHandler)

完整代碼:

import logging

# 配置logger并設置等級為DEBUG
logger = logging.getLogger('logging_debug')
logger.setLevel(logging.DEBUG)
# 配置控制臺Handler并設置等級為DEBUG
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)
# 將Handler加入logger
logger.addHandler(consoleHandler)

logger.debug('This is a logging.debug')

輸出結果:
This is a logging.debug

原文鏈接:https://blog.csdn.net/Nana8874/article/details/126041032

欄目分類
最近更新