top of page
Search
Learn with Shin

Logging - 掌控你的程式

Updated: Jul 11, 2021



相信大家都同意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


Post: Blog2_Post
bottom of page