python程序调试logging_python-logging模块的简单使用
本人是新手程序員,寫文章是為了記錄學習,文章中多有錯誤,還望大家諒解,并指出問題。
本文用到的技術與工具:python,pycharm,logging等。
最近寫了一個程序demo,一天24小時掛著跑,有時候會報錯,雖然不會影響程序繼續跑,但是問題總是要解決的,又不能24小時守著,所有想寫個日志記錄錯誤信息,日志當然已經搞定了啦,下面是正文。
日志是什么,日志的作用是什么,這里就不一一贅述了,這里使用python的logging模塊來進行日志操作。
1、logging模塊的日志級別
logging模塊默認定義了以下幾個日志等級,它允許開發人員自定義其他日志級別,但是這是不被推薦的,尤其是在開發供別人使用的庫時,因為這會導致日志級別的混亂。logging默認日志等級
開發應用程序或部署開發環境時,可以使用DEBUG或INFO級別的日志獲取盡可能詳細的日志信息來進行開發或部署調試;
應用上線或部署生產環境時,應該使用WARNING或ERROR或CRITICAL級別的日志來降低機器的I/O壓力和提高獲取錯誤日志信息的效率。日志級別的指定通常都是在應用程序的配置文件中進行指定的。
注意:
~上圖列表中的日志等級是從上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次減少的;
~當為某個應用程序指定一個日志級別后,應用程序會記錄所有日志級別大于或等于指定日志級別的日志信息,而不是僅僅記錄指定級別的日志信息,只有級別大于或等于該指定日志級別的日志記錄才會被輸出,小于該等級的日志記錄將會被丟棄。
2、logging模塊的使用方式
logging模塊提供了兩種使用方式:一、使用logging提供的模塊級別的函數;二、使用Logging日志系統的四大組件。logging所提供的模塊級別的日志記錄函數是對logging日志系統相關類的封裝
上述是我參考的資料中所說的,看了第一種方式的使用過程,我有點不太理解如何自如使用,既然說到是對第二種方式的封裝,那我大概理解成了我太菜了,還沒到那個等級,所有本文就不介紹第一種方式了,直接第二種方式開擼!
3、使用Logging日志系統的四大組件,日志流的處理流程
首先給大家看一下logging模塊定義的模塊級別的常用函數,如下圖:logging模塊定義的模塊級別的常用函數
關于logging.basicConfig()函數,我百度了大量資料,在眾多資料中有些提到該函數的參數時包含了handlers,有些沒有,參數handlers的使用方法仍未找到,希望有大佬知道的可以教一下我,logging.basicConfig()函數的參數說明如下圖:logging.basicConfig()函數的參數說明
我們已經知道logging的常用函數,下面看看lgging模塊的四大組件:lgging模塊的四大組件
這些組件之間是什么樣的關系呢?日志器(logger)需要通過處理器(handler)將日志信息輸出到目標位置,如:文件、sys.stdout、網絡等;
不同的處理器(handler)可以將日志輸出到不同的位置;
日志器(logger)可以設置多個處理器(handler)將同一條日志記錄輸出到不同的位置;
每個處理器(handler)都可以設置自己的過濾器(filter)實現日志過濾,從而只保留感興趣的日志;
每個處理器(handler)都可以設置自己的格式器(formatter)實現同一條日志以不同的格式輸出到不同的地方。
簡單點說就是:日志器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對要輸出的日志內容做過濾和格式化等處理操作。
3.1、logger類
logger對象有三個任務要做:1)向應用程序代碼暴露幾個方法,使應用程序可以在運行時記錄日志消息;
2)基于日志嚴重等級(默認的過濾設施)或filter對象來決定要對哪些日志進行后續處理;
3)將日志消息傳送給所有感興趣的日志handlers。
Logger對象最常用的方法分為兩類:配置方法 和 消息發送方法
最常用配置方法如下:logger對象常用配置方法
logger對象配置完成后,可以使用下面的方法來創建日志記錄:創建日志記錄的方法
通常使用logging.getLogger()方法創建一個logger實例,logging.getLogger()方法有一個可選參數name,該參數表示將要返回的日志器的名稱標識,如果不提供該參數,則其值為'root'。若以相同的name參數值多次調用getLogger()方法,將會返回指向同一個logger對象的引用。多次使用注意不能創建多個logger,否則會出現重復輸出日志現象。
3.2、handler類
Handler對象的作用是(基于日志消息的level)將消息分發到handler指定的位置(文件、網絡、郵件等)。Logger對象可以通過addHandler()方法為自己添加0個或者更多個handler對象。
需要說明的是,應用程序代碼不應該直接實例化和使用Handler實例。因為Handler是一個基類,它只定義了素有handlers都應該有的接口,同時提供了一些子類可以直接使用或覆蓋的默認行為。下面是一些常用的Handler:常用Handler
3.3、formatter類
Formater對象用于配置日志信息的最終順序、結構和內容。
3.4、filter類
Filter可以被Handler和Logger用來做比level更細粒度的、更復雜的過濾功能。
日志流簡要處理流程(按照日志時間切割)
1、創建一個logger,如果參數為空則返回root logger
logger = logging.getLogger('')
2、設置下logger的日志的等級
logger.setLevel(logging.DEBUG)
3、創建合適的Handler(FileHandler要有路徑),我這里創建了一個根據時間切分的Handler
下方代碼中,'when='S''表示以秒切割文件;'interval=1'表示切割的標準為間隔為1秒;'backupCount=3'表示日志文件總數為3,也就是說日志文件數等于3時,后面生成的日志文件會替換掉時間最早的日志文件;fh.suffix設置日志文件名時間后綴。
fh = logging.handlers.TimedRotatingFileHandler("test.log", when='S', interval=1, backupCount=3, encoding="utf-8")
fh.suffix = "%Y-%m-%d_%H-%M-%S.log"
ch = logging.StreamHandler()
4、創建日志的格式
formatter = logging.Formatter(
fmt="%(asctime)s %(name)s %(filename)s %(message)s",
datefmt="%Y/%m/%d %X"
)
5、向Handler中添加上面創建的格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
6、將上面創建的Handler添加到logger中
logger.addHandler(fh)
logger.addHandler(ch)
7、打印輸出
logger.warning("警告")
logger.info("提示")
logger.error("錯誤")
logger.debug("查錯")
例子:
import logging
import logging.handlers #按時間切割一定要導入該模塊
def log():
logger = logging.getLogger("") ?#創建logger,如果參數為空則返回root logger
logger.setLevel(logging.DEBUG) ?#設置logger日志等級
#這里進行判斷,如果logger.handlers列表為空,則添加,否則,直接去寫日志
if not logger.handlers:
#創建handler
#按照時間切分文件,interval指間隔時間數目,backupCount指保留的文件個數
fh = logging.handlers.TimedRotatingFileHandler("test.log", when='S', interval=1, backupCount=3, encoding="utf-8")
fh.suffix = "%Y-%m-%d_%H-%M-%S.log"
ch = logging.StreamHandler()
#設置輸出日志格式
formatter = logging.Formatter(
fmt="%(asctime)s %(name)s %(filename)s %(message)s",
datefmt="%Y/%m/%d %X"
)
#為handler指定輸出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#為logger添加的日志處理器
logger.addHandler(fh)
logger.addHandler(ch)
return logger #直接返回logger
logger = log()
logger.warning("警告")
logger.info("提示")
logger.error("錯誤")
logger.debug("查錯")
上面的例子中標紅部分"if not?logger.handlers:"是為了解決重復寫日志問題,當然還有其他解決方案,比如在為logger添加日志處理器后removeHandler,具體用哪種方案看個人喜好吧。
例子運行看看效果如何,控制臺
控制臺打印出了日志信息,運行四次程序看看生成的日志文件,運行四次程序生成的日志文件
第一次運行生成了“test.log”文件,后面三次生成了按照時間切割后的文件,再運行一次看看,運行第五次程序后生成的日志文件
可以看到后綴為43的文件被替換成了后綴為49的文件,成功!
主要參考資料鏈接地址:https://www.cnblogs.com/yuanyongqiang/p/11913812.html
總結
以上是生活随笔為你收集整理的python程序调试logging_python-logging模块的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmv空调与志高区别
- 下一篇: pythonandroid自动化测试仪器