相信大家都同意Python的print功能是我們的好朋友🧑🤝🧑。
常常我們為了看一下程式的執行中的情況,會利用print來顯示(譬如說variable的)數值到console上,在抓bug的時候也很好用!
譬如說我們有一個program長這樣👇,看到numbers這個list裡面有一個會造成錯誤的值叫做 " I am the bug":
當我們遭遇到預期外的數值時,我們往往用print來看一下那個數值長什麼樣子,上述的例子你就會看到 "I am the bug" 被印出來。
OK...print是很好用,但是如果說我的program有很多print指令,而且其重要性不一,會是什麼情況呢?
來看看下面簡單的例子:
想當然爾,如果照上面的code,不管你的message重不重要,全部都會被print出來。
那有沒有一個方法可以去根據我的需要(或心情)只顯示我需要的message呢?
有的!那就是我們今天要來看的logging模組!
logging的等級設定
不廢話,直接來看例子:
我們把之前的print全都換成的logging所提供的功能,這裡看到我們僅僅兩個message,logging.error跟logging.warning有被log出來:
logging.error("this message is very important.")
logging.warning("this message is kind of important")
logging的主要功能之一,就是可以讓你控制你要log的等級(level)。所謂的等級指的是(你認為的)訊息重要性。
由高至低依序為:
CRITICLE
ERROR
WARNING
INFO
DEBUG
如果你沒有特別指定,原來(default)的設定是Warning。
來看看下面的例子:
logging.basicConfig功能可以讓你做一些基本設定,這裡將level設定為INFO。
接著我們重新在執行剛剛的code:
這一次包括logging.info的訊息都被log下來了!
結論就是,如果你使用的logging功能等於或是高於你設定的level的話,訊息就會成功的被log下來。如果你想要log所有的東西的話,將level設定為DEBUG就行了。
現在我們把一開頭的例子中print statement的部分都換成用logging,並把等級設定為INFO:
這裡另外加上了一個logging.debug(f"current number: {n}"。目前因為我的level設定在INFO所以它不會被log,但是我之後如果想看debug的訊息的話我只要把等級改成DEBUG就好了!
一般來說當你的level設定的越高,代表你想要減少log的數量(或是雜音),因為你不在意既定level以下的logs。
這邊順便介紹一個小trick,如果我們log的對象是像例子中的Exception,我們可以用logging.exception來顯示log的內容跟詳細錯誤訊息。
當我們的program比較複雜,或者是在你自己的電腦以外的地方(譬如說要放進公司的production系統)執行的時候,我們都會用到像logging這種比較正式,也更容易管理的方式來追蹤程式的執行狀況。
logging的場所以及格式設定
利用logging模組,除了level以外,還有其他相當有用的設定。
譬如說,有時候你想要保存你的log,而不是單純的顯現在console上面。你可以選擇log到檔案上:
上面的例子,你的logs會被寫入叫做mylogs.log的file裡。
然後你會發現每執行一次,你的log會持續被加到這個mylog.log的檔案。如果你想要每一次都重新覆蓋(override)原來的file的話,你可以加上filemode='w':
除了log的場所以外,還有一個常用的設定:log的訊息格式。
我們剛剛看的log原始格式長的像這樣:
INFO:root:Invaid value: I am the bug
我可以把格式做一個更改,利用format這個argument來指定:
出來的結果就會變成這樣:
2021-06-11 14:58:09,226 : Invalid value: I am the bug
這裡看到format的格式寫法中有一些長的有點特別的語法:像是"%(asctime)s" 以及 "%(message)s"。
這些是logging提供給我們的特殊語法讓我們可以擷取這些log紀錄的metadata,像是file的名字,時間,log message或是level等等。詳細的清單可以參考這裡。
如果我們想進一步的針對譬如說時間日期的格式做修改,我們可以利用一個argument叫做datefmt來做出你想要的格式:
日期的格式就變成這樣:
06/12/2021 14:46 : Invalid value: I am the bug
如果對Python的日期(及時間)的處理方式或格式想要了解更多,歡迎參考我們另一篇文章:如何處理python-的日期時間資料-datetime 。
今天我們簡單介紹了Python的logging模組。透過這些設定:
logging等級
logging場所
logging訊息格式
來幫助我們可以寫出更好管理又具彈性的程式,希望對大家有幫助喔!
Comments