Logging框架主要作用是Python里面處理日志
一.logging模塊的組成
- loggers :提供應用程序直接使用的接口
- handlers:發(fā)送日志記錄到哪里
- filters: 限制只有滿足過濾規(guī)則的日志才會輸出。
- formatters:日志記錄的格式
loggers
Logger為日志系統(tǒng)的入口。暴露給代碼使用,每個logger的命名都是bucket,你可以向這個bucke輸入需要處理的消息碴开。
每個Logger都有一個日志級別胀瞪,日志級別表示將要處理這個消息的嚴重性蘑险。Python定義了一下集中日志級別:
- DEBUG: 用于調(diào)試目的代碼信息
- INFO: 普通的日志信息
- WARNING: 警告信息冠摄,一個問題嚴重比較小的信息。
- ERROR:錯誤信息毁兆,一個問題嚴重比較大的信息。
-
CRITICAL: 危險致命的信息阴挣。超級嚴重
寫入logger 的每條消息都是一個日志記錄气堕。每個日志記錄也具有一個日志級別,它表示對應的消息的嚴重性畔咧。每個日志記錄還可以包含描述正在打印的事件的有用元信息茎芭。這些元信息可以包含很多代碼細節(jié),例如回溯検姆校或錯誤碼梅桩。
當輸入一條消息給logger 時,會將消息的日志級別與logger 的日志級別進行比較拜隧。如果消息的日志級別大于等于logger 的日志級別宿百,該消息將會往下繼續(xù)處理。如果小于洪添,該消息將被忽略垦页。
Logger 一旦決定消息需要被處理,它將傳遞該消息給一個Handler,由它來決定如何處理這個消息干奢,打印到console外臂,文件流的方式寫入文件,或者網(wǎng)絡流的方式發(fā)送一個網(wǎng)絡socket.
handlers
Handlers決定如何處理Logger里面的每條日志消息。它表示一個特定的日志處理行為宋光,例如:講日志消息打印在console屏幕上貌矿,寫到文件中,或者寫入網(wǎng)絡socket里罪佳。
與logger一樣逛漫,Handler也有一個日志級別。如果消息的日志級別小于handler的級別赘艳,handler講忽略這條消息酌毡。
logger可以有多個handler,而每個hander可以有不同的日志級別蕾管。利用這種方式枷踏,可以根據(jù)消息的重要性,提供不同的handler處理方法掰曾。例如:我們可以利用一個handler將ERROR和CRITICAL消息發(fā)送給一個頁面旭蠕,而用另一個handler將所有的信息記錄到一個文件中用于以后的分析。
Filters
Filter 用于對從logger 傳遞給handler 的日志記錄
進行額外的控制旷坦。默認情況下掏熬,滿足日志級別的任何消息都將被處理。通過安裝一個filter秒梅,你可以對日志處理添加額外的條件旗芬。例如,你可以安裝一個filter對其日志消息作攔截處理捆蜀,只允許處理來自特定源的ERROR消息疮丛。
Filters 還可以用于修改將要處理的日志記錄的優(yōu)先級。例如辆它,如果日志記錄滿足特定的條件这刷,你可以編寫一個filter 將日志記錄從ERROR降為WARNING。
Filters 可以安裝在logger 上或者handler 上娩井;多個filter 可以串聯(lián)起來實現(xiàn)多層filter 行為暇屋。
Formatters
最后,日志記錄需要轉(zhuǎn)換成文本洞辣。Formatter 表示文本的格式咐刨。Fomatter 通常由包含日志記錄屬性的Python 格式字符串組成;
你也可以編寫自定義的fomatter 來實現(xiàn)自己的格式扬霜。
二.使用logging
配置好logger定鸟、handler、filter 和formatter 之后著瓶,你需要在代碼中放入logging 調(diào)用联予。使用logging 框架非常簡單。下面是個例子:
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
就是這樣!每次滿足bad_mojo條件沸久,將寫入一條錯誤日志記錄季眷。
命名Logger
注意:永遠不要直接初始化Logger。而應該通過模塊級別函數(shù)logging.getLogger()調(diào)用獲取一個Logger的實例來得到它卷胯。Logger實例通過名字標示子刮,Logger使用名稱目的是用于標示其配置。
Logger 的名稱習慣上通常使用__name__
窑睁,即包含該logger 的Python 模塊的名字挺峡。這允許你基于模塊filter 和handle 日志調(diào)用。如果你想使用其它方式組織日志消息担钮,可以提供點號分隔的名稱來標識你的logger:
# Get an instance of a specific named
loggerlogger = logging.getLogger('project.interesting.stuff')
點號分隔的logger 名稱定義一個層級橱赠。它們在概念上組織成一個層級式的命名空間,用 dots(periods) 作為分割符箫津,例如 'project' 是 'project.interesting' , 的父Logger,"project.interestin"是"project.interestin.stuff"的父logger,Logger 的名稱可以任意命名狭姨,用以表示記錄的信息是在應用程序的哪個部分產(chǎn)生。
層級(module-level logger)為何如此重要鲤嫡?因為可以設置logger 傳播它們的logging 調(diào)用給它們的上一級。利用這種方式绑莺,你可以在根logger 上定義一系列的handler暖眼,并捕獲子logger 中的所有l(wèi)ogging 調(diào)用。
在project命名空間中定義的handler 將捕獲project.interesting和project.interesting.stuff logger 上的所有日志消息纺裁。這種傳播行為可以基于每個logger 進行控制诫肠。如果你不想讓某個logger 傳播消息給它的上一級,你也可以關(guān)閉這個行為欺缘。
logging的調(diào)用
Logger 實例為每個默認的日志級別提供一個入口方法:
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
還有另外兩個調(diào)用:logger.log()
:打印消息時手工指定日志級別栋豫。logger.exception()
:創(chuàng)建一個ERROR級別日志消息,它封裝當前異常棧的幀谚殊。
配置logging
當然丧鸯,只是將logging 調(diào)用放入你的代碼中還是不夠的。你還需要配置logger嫩絮、handler丛肢、filter 和formatter 來確保日志的輸出是有意義的。
Python 的logging 庫提供幾種配置logging 的技術(shù)剿干,從程序接口到配置文件蜂怎。
默認情況下,Django 使用dictConfig 格式
為了配置logging置尔,你需要使用LOGGING 來定義字典形式的logging 設置杠步。
這些設置描述你的logging 設置的logger、handler、filter 和formatter幽歼,以及它們的日志等級和其它屬性朵锣。
待續(xù)