logging是Python 2.3起自帶的標準模塊,能夠用來從運行狀態的程序中記錄日誌。logging模塊的功能很是強大,能夠很是靈活的向各類預約或者自定的目標輸出日誌。而利用標準的logging模塊,Django程序就能夠輕鬆實現運行環境下的日誌輸出,這對於開發以及部署環境下程序運行具體狀況的監控和調試都是不可或缺的,因此我在這裏總結一下本身的一些經驗。python
Django程序使用logging輸出的基本設置
要讓Django程序正確得利用logging模塊輸出日誌,首先須要在settings.py中配置好logging參數:正則表達式
<!-- lang: python --> loggin.basicConfig( level = logging.DEBUG, format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s', )
logging.basicConfig
是logging模塊提供的簡便配置logging參數的方法。通過以上的配置,在Django程序中只須要經過logging.debug,logging.info等方法就能夠輸出日誌了。django
logging.DEBUG
及以上級別的日誌都會直接輸出到django運行時當前命令窗口,而在生產環境下,只須要相應的提升logging輸出級別就能夠控制日誌輸出的內容,避免輸出過多日誌內容。
(關於logging級別和logging的基本知識請參考pydoc) 在本地調試使用manage.py runserver
的時候,logging內容就會直接出如今console裏。命令行
以上的基本設置只能讓日誌直接輸出到命令行窗口。須要把日誌輸出到文件保存的話最簡便的方法是這樣debug
<!-- lang: python --> logging.basicConfig( level = logging.DEBUG, format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s', filename = '/path/to/logfile/filelog.log', )
在logging.basicConfig方法中,只要指定了filename,那麼日誌就會直接輸出到指定的文件了。調試
在生產環境下,不只須要把日誌寫到文件,一般還須要把日誌文件按日期分割保存。這樣的任務用logging模塊也很容易作到。在生產環境的settings.py
裏使用以下設置:日誌
<!-- lang: python --> root = logging.getLogger() if len(root.handlers) == 0 #避免重複 level = logging.INFO filename = '/path/to/logfile/filelog.log' format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s' hdlr = TimedRotatingFileHandler(filename,"midnight",1,5) fmt = Formatter(format) hdlr.setFormatter(fmt) root.addHandler(hdlr) root.setLevel(level)
在這裏使用了logging模塊預約義的TimedRotatingFileHandler
類,在天天半夜滾動日誌文件,而最多保留5個以往的日誌文件。因爲須要指定特殊的Handler,因此這裏不能使用logging.basicConfig
的簡便方法。code
用好日誌功能能夠對開發和調試起到不少幫助做用。使用了logging模塊能夠經過日誌級別很是方便的控制輸出,不須要增減任何程序代碼,只須要在settings.py
中更改logging級別一行代碼就好了。orm
因此在開發過程當中,能夠儘可能多用logging.debug
輸出對調試有幫助的內容。而在生產環境下,經過日誌也能夠方便的分析真實運行環境下的一些問題,便於調試修改bug。server
若是用在Google App Engine,不須要指定輸出文件,程序輸出的日誌都會直接保存在App Engine運行日誌中,還能夠經過正則表達式來搜索以往日誌。
另外,經過Django debug toolbar,能夠方便的直接在調試環境下直接在每一個頁面上查看輸出的日誌,很是好用。
因此,若是你在寫Django程序,就不要再用原始的print了,用好logging能夠事半功倍。