寫在之前
在我們的現實生活中,「日誌記錄」其實是一件非常重要的事情,比如銀行的轉賬記錄,汽車的行車記錄儀記錄行駛過程中的一切,如果出現了什麼問題,我們可以通過「日誌記錄」來搞清楚到底發生了什麼事情。
除了在生活中,在日常的系統開發以及除錯等過程中,記錄日誌同樣是一件很重要的事情。很多程式設計初學者並沒有「記錄日誌」的習慣,認為記錄日誌是一件可有可無的事情,出現問題的時候只要使用 print 函式列印一下程式的中間結果即可,真是 too young too *****。只是 print 的話對於簡單的指令碼程式來說或許可行,可是到了碰到複雜的系統,你如果還是只用 print 這種方式的話,你會看到大量的訊息,看到吐也不一定能找到其中有用的訊息。
「日誌」是乙個系統的重要組成部分,用來記錄使用者操作、系統執行狀態和錯誤資訊,它的好壞直接影響到系統出現問題時定位的速度,有日誌記錄,我們可以在服務崩潰的時候很快的通過檢視日誌來發現問題出現的地方,同樣也可以通過對日誌的觀察和分析,提前發現系統可能存在的風險。
python 的標準日誌模組
上面我們說了「日誌」是如此的重要,作為無所不能的 python 當然也有日誌相關的功能,python 標準庫中提供了 logging 模組供我們使用。在最簡單的使用中,預設情況下 logging 將日誌列印到螢幕終端,我們可以直接匯入 logging 模組,然後呼叫 debug,info,warn,error 和 critical 等函式來記錄日誌,預設日誌的級別為 warning,級別比 warning 高的日誌才會被顯示(critical > error &g warning > info > debug),「級別」是乙個邏輯上的概念,用來區分日誌的重要程度。
import logging
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message'程式設計客棧)
logging.error("error message")
logging.critical('critical message')
上述**的執行結果如下所示:
warning:root:warn message
error:root:error message
critical:root:critical message
我在上面說過,用 print 的話會產生大量的資訊,從而很難從中找到真正有用的資訊。而 logging 中將日誌分成不同的級別以後,我們在大多數時間只儲存級別比較高的日誌資訊,從而提高了日誌的效能和分析速度,這樣我們就可以很快速的從乙個很大的日誌檔案裡找到錯誤的資訊。
配置日誌格式
我們在用 logging 來記錄日誌之前,先來進行一些簡單的配置:
import logging
logging.basicconfig(filename= 'test.log', level= logging.info)
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上面的例子中,我是用 basicconfig 對日誌進行了簡單的配置,其實我們還可以進行更為複雜些的配置,在此之前,我們先來了解一下 logging 中的幾個概念:
上述三者的關係是:乙個 logger 使用乙個 handler,乙個 handler 使用乙個 formatter。那麼概念我們知道了,該如何去使用它們呢?我們的 logging 中有很多種方式來配置檔案,簡單的就用上面所說的 basicconfig,對於比較複雜的我們可以將日誌的配置儲存在乙個配置檔案中,然後在主程式中使用 fileconfig 讀取配置檔案。
基本的知識我們知道了,下面我們來做乙個小的題目:日誌檔案儲存所有 debug 及其以上級別的日誌,每條日誌中要有列印日誌的時間,日誌的級別和日誌的內容。請先自己嘗試著思考一下,如果你已經思考完畢請繼續向下看:
import logging
logging.basicconfig(
level= logging.debug,
format = '%(asctime)s : %(levelname)s : %(message)s',
filename= "test.log"
)logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error messag")
logging.critical('critical message')
上述**的一次執行結果如下:
2018-10-19 22:50:35,225 : debug : debug message
2018-10-19 22:50:35,225 : info : info message
2018-10-19 22:50:35,225 : warning : warn message
2018-10-19 22:50:35,225 : error : error message
2018-10-19 22:50:35,225 : critical : critical message
我剛剛在上面說過,對於比較複雜的我們可以將日誌的配置儲存在乙個配置檔案中,然後在主程式中使用 fileconfig 讀取配置檔案。下面我們就來看乙個典型的日誌配置檔案(配置檔案名為 logging.conf):
[loggers]
keys = root
[handlers]
keys = logfile
[formatters]
keys = generic
[logger_root]
handlers = logfile
[handler_logfile]
class = handlers.timedrotatingfilehandler
args = ('test.log', 'midnight', 1, 10)
level = debug
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在上述的日誌配置檔案中,首先我們在 [loggers] 中宣告了乙個叫做 root 的日誌記錄器(logger),在 [hvaluahandlers] 中宣告了乙個叫 logfile 的日誌處理器(handler),在 [formatters] 中宣告了乙個名為 generic 的格式化(formatter)。之後在 [logger_root] 中定義 root 這個日誌處理器(logger) 所使用的日誌處理器(handler) 是哪個,在 [handler_logfile] 中定義了日誌處理器(handler) 輸出日誌的方式、日誌檔案的切換時間等。最後在 [formatter_generic] 中定義了日誌的格式,包括日誌的產生時間,級別、檔名以及行號等資訊。
有了上述的配置檔案以後,我們就可以在主**中使用 logging.conf 模組的 fileconfig 函式載入日誌配置:
import logging
import logging.config
logging.config.fileconfig('logging.conf')
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上述**的執行一次的結果如下所示:
2018-10-19 23:00:02,809 warni [root:8] warn message
2018-10-19 23:00:02,809 error [root:9] error message
2018-10-19 23:00:02,809 criti [root:10] critical message
寫在之後
正如標題中所說的那樣,我認為「日誌記錄」是每個 python 程式設計師必須要知道且學會的東西,也是每個程式設計師必須具備的意識。如果你之前沒有使用過日誌亦或者說不知道該怎麼去使用日誌記錄,這篇文章我相信會給你帶來一些幫助。
python 的日誌庫設計之好,用起來之靈活,可以說是 python 標準庫中相當優秀的存在。當然上面我們所說的只是 python 日誌庫中很少的一部分,更程式設計客棧多的操作和內容還需要你在今後的學習和實踐中自己去發掘和運用。
the end。
程式設計師必須要掌握的語言
在有許多程式開發工具可供選擇的今天,強調 c c 是程式設計師所必須掌握的語言 難道就沒有人真的敢站出來提出質疑嗎?下面就由卓躍教育為您做乙個介紹 誠然,我們不能否認c c 語言的超凡魅力。然而我們不禁要設問,在windows流行的今天,用windowsc編制出介面獨特 功能強大的應用程式,你能嗎?...
程式設計師必須掌握的linux知識
4 重定向 管道 5 標準輸出 標準錯誤 6 使用 遮蔽乙個特殊字元的含義 7 正規表示式 二 熟練掌握vim編輯器。三 liunx環境下shell指令碼 perl指令碼的編寫 為了對網上伺服器應用進行管理,通常需要編寫一些指令碼。指令碼的編寫重點掌握下面幾點 1 理解雙引號 單引號 反引號的含義。...
程式設計師必須掌握的排序演算法
氣泡排序 bubble sort 是一種較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名字由來是因為越大的元素會...