1. 程式人生 > >python-25 logging日誌模組之二

python-25 logging日誌模組之二

1. logging日誌框架

主要包括四部分:

  • Loggers: 可供程式直接呼叫的介面,app通過呼叫提供的api來記錄日誌
  • Handlers: 決定將日誌記錄分配至正確的目的地
  • Filters:對日誌資訊進行過濾, 提供更細粒度的日誌是否輸出的判斷
  • Formatters: 制定最終記錄列印的格式佈局

1)loggers

loggers 就是程式可以直接呼叫的一個日誌介面,可以直接向logger寫入日誌資訊。logger並不是直接例項化使用的,而是通過logging.getLogger(name)來獲取物件,事實上logger物件是單例模式,logging是多執行緒安全的,也就是無論程式中哪裡需要打日誌獲取到的logger物件都是同一個。但是不幸的是logger並不支援多程序,這個在後面的章節再解釋,並給出一些解決方案。

【注意】loggers物件是有父子關係的,當沒有父logger物件時它的父物件是root,當擁有父物件時父子關係會被修正。舉個例子,logging.getLogger("abc.xyz") 會建立兩個logger物件,一個是abc父物件,一個是xyz子物件,同時abc沒有父物件,所以它的父物件是root。但是實際上abc是一個佔位物件(虛的日誌物件),可以沒有handler來處理日誌。但是root不是佔位物件,如果某一個日誌物件打日誌時,它的父物件會同時收到日誌,所以有些使用者發現建立了一個logger物件時會打兩遍日誌,就是因為他建立的logger打了一遍日誌,同時root物件也打了一遍日誌。

2)Handlers

Handlers 將logger發過來的資訊進行準確地分配,送往正確的地方。舉個栗子,送往控制檯或者檔案或者both或者其他地方(程序管道之類的)。它決定了每個日誌的行為,是之後需要配置的重點區域。

每個Handler同樣有一個日誌級別,一個logger可以擁有多個handler也就是說logger可以根據不同的日誌級別將日誌傳遞給不同的handler。當然也可以相同的級別傳遞給多個handlers這就根據需求來靈活的設定了。

3)Filters

Filters 提供了更細粒度的判斷,來決定日誌是否需要列印。原則上handler獲得一個日誌就必定會根據級別被統一處理,但是如果handler擁有一個Filter可以對日誌進行額外的處理和判斷。例如Filter能夠對來自特定源的日誌進行攔截or修改甚至修改其日誌級別(修改後再進行級別判斷)。

logger和handler都可以安裝filter甚至可以安裝多個filter串聯起來。

4) Formatters

Formatters 指定了最終某條記錄列印的格式佈局。Formatter會將傳遞來的資訊拼接成一條具體的字串,預設情況下Format只會將資訊%(message)s直接打印出來。Format中有一些自帶的LogRecord屬性可以使用,如下表格:

一個Handler只能擁有一個Formatter 因此如果要實現多種格式的輸出只能用多個Handler來實現。

上圖只是一部分,更詳細的在docs.python.org裡找logging模組

 

2 .  logging.getLogger([name])

建立Logger物件。日誌記錄的工作主要由Logger物件來完成。在呼叫getLogger時要提供Logger的名稱(注:多次使用相同名稱來呼叫getLogger,返回的是同一個物件的引用。),Logger例項之間有層次關係,這些關係通過Logger名稱來體現,如:

p = logging.getLogger(“root”)

c1 = logging.getLogger(“root.c1”)

c2 = logging.getLogger(“root.c2”)

例子中,p是父logger, c1,c2分別是p的子logger。c1, c2將繼承p的設定。如果省略了name引數, getLogger將返回日誌物件層次關係中的根Logger。

-----------------------返回結果只有4條-------------------------

1.子節點列印時,若有父節點,則以以父節點的名義按照子節點的級別列印1次,故有出現子節點列印2次的現象

---------------返回9條資訊-------------