網站首頁 編程語言 正文
一般的小代碼,初學者可能會采取在適當的地方添加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
- 上一篇:Linux下查看文件和文件夾大小
- 下一篇:os.path模塊下的顯示路徑方法
相關推薦
- 2023-03-01 Maui?Blazor?使用攝像頭實現代碼_其它綜合
- 2022-10-14 linux服務器安裝redis并設置redis開機自啟和遠程連接
- 2022-04-11 git 強行拉取覆蓋本地方法(Git強制覆蓋本地代碼)
- 2021-12-13 VS在調試時,查看是DEBUG/RELEASE
- 2024-02-25 前端顯示的日期時間與數據庫日期時間不一致
- 2022-11-22 GraphQL在react中的應用示例詳解_React
- 2022-04-26 Swift踩坑實戰之一個字符引發的Crash_Swift
- 2022-10-27 Kotlin協程之Flow基礎原理示例解析_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支