Python logging模塊

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將ERRORCRITICAL消息發(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市试躏,隨后出現(xiàn)的幾起案子猪勇,更是在濱河造成了極大的恐慌,老刑警劉巖颠蕴,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泣刹,死亡現(xiàn)場離奇詭異,居然都是意外死亡犀被,警方通過查閱死者的電腦和手機椅您,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寡键,“玉大人掀泳,你說我怎么就攤上這事∥餍” “怎么了员舵?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藕畔。 經(jīng)常有香客問我马僻,道長,這世上最難降的妖魔是什么注服? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任韭邓,我火速辦了婚禮,結(jié)果婚禮上溶弟,老公的妹妹穿的比我還像新娘女淑。我一直安慰自己,他們只是感情好辜御,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布鸭你。 她就那樣靜靜地躺著,像睡著了一般擒权。 火紅的嫁衣襯著肌膚如雪苇本。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天菜拓,我揣著相機與錄音瓣窄,去河邊找鬼。 笑死纳鼎,一個胖子當著我的面吹牛俺夕,可吹牛的內(nèi)容都是我干的裳凸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼劝贸,長吁一口氣:“原來是場噩夢啊……” “哼姨谷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起映九,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤梦湘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后件甥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌议,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年引有,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓣颅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬正,死狀恐怖宫补,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曾我,我是刑警寧澤粉怕,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站抒巢,受9級特大地震影響贫贝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虐秦,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一平酿、第九天 我趴在偏房一處隱蔽的房頂上張望凤优。 院中可真熱鬧悦陋,春花似錦、人聲如沸筑辨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍辕。三九已至暮现,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楚昭,已是汗流浹背栖袋。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抚太,地道東北人塘幅。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓昔案,卻偏偏與公主長得像,于是被迫代替她去往敵國和親电媳。 傳聞我的和親對象是個殘疾皇子踏揣,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容