級別
何時使用
debug
細節資訊,僅當診斷問題時使用
info
確認程式按預期執行
warning
表明已經或即將發生的意外(例如:磁碟空間不足)。程式仍按預期進行
error
由於嚴重的問題,程式的某些功能已經不能正常執行
critical
嚴重的錯誤,表明程式已不能繼續執行
預設等級是「warning」,意味著只會跟蹤該級別及以上的事件(由上倒下等級以此遞增),除非更改日誌配置。
1. quick start
>>> import logging
>>> logging.warning("warning")
warning:root:warning
>>> logging.info("information")
>>>
注意這裡只有warning的資訊列印出來了。如前面所說,預設等級是「warning」,只會追蹤該級別及以上的事件,所以info資訊沒有被列印出來。
其中warning是記錄級別;root代表列印的模組**(沒有顯示設定,顯然是預設值,甚至不是當前模組的名稱);warning就是我們顯示列印的資料資訊了。
2. 記錄日誌到檔案
import logging
logging.basicconfig(filename='pycode.log', level=logging.debug)
logging.warning('warning')
logging.info('information')
logging.debug('debug')
通過設定logging的基本配置可以將記錄重定向到檔案中。同時可以通過level指定列印級別。
# pycode.log
warning:root:warning
info:root:information
debug:root:debug
注意到,此時在檔案中的列印級別已經降為 debug了。該方法也適用在命令列中修改列印級別。
但有個需要注意的點:對basicconfig的呼叫應該在debug(),info()等函式前面。basicconfig是一次性的配置,只有第一次呼叫會進行操作,隨後的呼叫不會產生有效操作。
什麼意思呢?舉個例子:
>>> import logging
>>> logging.warning("123")
warning:root:123
>>> logging.info("123") # 不會有輸出
>>> logging.basicconfig(level=logging.debug)
>>> logging.info("123") # 依舊不會有輸出
另乙個例子:
>>> import logging
>>> logging.basciconfig(level=loggin.debug)
>>> logging.warning("123")
warning:root:123
>>> logging.info("123")
info:root:123
在第一次呼叫logging.info()、warning()等函式的時候,就會呼叫內建的basicconfig。此時就已經固化列印級別為warning了,即使後面再次顯式呼叫basicconfig也不會有效。
命令列指定級別:除了通過basicconfig設定level,也可以在執行python程式的時候,通過命令列引數指定。
$ 設定logging列印級別為info
$ python3 pycode.py --log=info
追加列印:此外,記錄輸出到檔案中,預設是追加列印的。如果希望重新記錄,可以這樣:
logging.basicconfig(filename='pycode.log', filemode='w', level=logging.debug)
3. 多模組列印
# main.py
import logging
import somelib
logging.basicconfig(level=logging.info)
def main():
logging.info("py01")
py02.do_something()
if __name__ == '__main__':
main()
# ---------------------------
# somelib.py
import logging
def do_something():
logging.info("py02")
輸出:
# pycode.log
info:root:py01
info:root:py02
可以看到,多模組的資訊都能正常列印到日誌檔案中。但很明顯可以發現不論是從哪個模組輸出,日誌記錄中顯示的都是root。所以目前還不能跟蹤記錄列印的模組**。
4. 定義列印格式
同樣可以在basicconfig中定義列印的格式:
>>> import logging
>>> logging.basicconfig(format='%(asctime)s : %(name)s : %(message)s', level=logging.info)
>>> logging.info("123")
2020-06-19 22:38:16,048 : root : 123
可以看到,此時展示了列印時間,模組**及記錄資訊。
格式配置屬性:
格式描述
%(asctime)s
呼叫訊息記錄列印時的時間(格式化後的時間)
%(created)f
呼叫訊息記錄列印時的時間(未格式化的描述,相當於time.time())
%(filename)s
呼叫訊息記錄列印的檔名稱(在哪個檔案裡面)
%(funcname)s
呼叫訊息記錄列印的函式名稱(在哪個函式裡面)
%(levelname)s
訊息記錄級別(debug,info,warning,error,critical)
%(levelno)s
訊息記錄級別的數字號(debug=10,info=20,warning=30,error=40,critical=50)
%(lineno)d
呼叫訊息記錄列印的行數(在哪一行列印的)
%(message)s
待列印的自定義訊息
%(module)s
呼叫訊息記錄的模組名
%(msecs)d
呼叫訊息記錄列印時間的毫秒部分
%(name)s
列印訊息的logger物件名稱(自定義的,預設是root)
%(pathname)s
呼叫訊息記錄的檔案路徑
%(process)d
程序id
%(processname)s
程序名%(relativecreated)d
相對logging模組被載入到列印訊息記錄時的相對時間(毫秒)
%(thread)d
執行緒id
%(threadname)s
執行緒名
# main.py
import logging
import somelib
logging.basicconfig(
level=logging.info,
format="%(asctime)s: %(name)s: %(levelname)s: %(message)s")
logger = logging.getlogger("main123")
def main():
logger.info("py01")
somelib.do_something()
if __name__ == '__main__':
main()
# ------------------------------
# somelib.py
import logging
logger = logging.getlogger("pylib")
def do_something():
logger.info("py02")
# ------------------------------
# 輸出
2020-06-19 23:26:27,263: main123: info: py01
2020-06-19 23:26:27,264: pylib: info: py02
有其他的需求,也可以根據上面列出來的屬性自行搭配。 Django專案如何正確配置日誌 logging
當django專案正式部署上線後,我們需要設定debug false。這時開發者應怎樣檢查django程式在生產環境執行時有什麼異常或錯誤呢?答案就是日誌 logging 在生產環境中,django預設是不會在伺服器上自動生成log檔案的,即使程式出現error級別的故障也不會通知管理員。本文將教你...
Python日誌列印
簡單示例 import sys import ctypes import logging import logging.handlers reload sys sys.setdefaultencoding utf 8 log file test log logging.basicconfig fil...
Python日誌列印
python日誌列印 import logging logging.warning warning message 預設輸出級別為warning,只會輸出級別高於30 的日誌 level numeric value critical50 error40 warning30 info20 debug1...