over 4 years ago

Python logging 系統主要分成三大部分:

  1. Logger - 觸發訊息紀錄。
  2. Handler - 處理訊息的顯示/儲存。
  3. Filter - 過濾訊息。

除此之外,還有一個 Formatter,用來排版訊息的顯示/儲存的格式。

簡介

Adapter 是包在 Logger 之上,在觸發訊息紀錄時,對於訊息的內容本體做一個預先處理 (pre-processing),有點 Middleware 的感覺。

撰寫

繼承 logging.LoggerAdapter 後,覆寫 (Override) 自己的 process,最後回傳 msgkwargs

例子
class MyAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        msg = "[Preprocessed] %s" % msg
        return msg, kwargs

使用方式

>>> my_logger = MyAdapter(logging.getLogger(""), {})
>>> my_logger.info("My first adapter testing.")
[INFO    ] 2014-02-17 14:46:34 (<module>) [Preprocessed] My first adapter testing.

此時,每當 exec_logger 觸發一個 log 指令(debug, info, error, ...),都會被你的 Adapter 預先處理,以上面的例子來說,每個 Message 都會被加上 [Preprocessed] 的標籤。

接收額外參數

我一開始在寫 Logger 是想到的問題是:是否能夠多帶入其他參數來處理?例如:

my_logger.info("This is an infomation", user="admin")  

一般的 Logger 在處理關鍵字參數時,僅僅接受 exc_infoextra。因此想要處理額外的參數,就需要透過 Adapter。

例子
class MyAdapter2(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        if "user" in kwargs:
            user = kwargs.pop("user")
            msg = "%s(by %s)" % (msg, user)
        return msg, kwargs

實際實行的結果

>>> my_logger2 = MyAdapter2(logging.getLogger(""), {})
>>> my_logger2.info("This is my logging message.", user="jim")
[INFO    ] 2014-02-17 14:40:28 (<module>) This is my logging message.(by jim)

唯一要注意的是,自帶的參數都必須從回傳的 kwargs 拔除,因為其他參數是不被接受的。

參考資料

  1. Python Logging Adapter
← Git Subtree 試用 Bootstrap 3 升級筆記 →
 
comments powered by Disqus