Python列印日誌庫(logging)

2021-10-07 08:33:35 字數 4595 閱讀 1451

級別

何時使用

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...