2012年9月3日 星期一

心得:稍微加強一下 Python 的 logging module

Python 的 logging module 是一個非常好用、方便的工具
關於他的介紹除了官方文件外
這裡有一篇雖然是英文可是淺顯易懂的文章 Good logging pratice in Python 推薦參考

我發現我個人使用 logging 時,特別是使用 logger.error 來紀錄一些例外狀況時
  • 會想要隨手塞幾個 object 當作參數
  • 使用 logger.error 後,常伴隨著的是 return False 的語句
因此我嘗試寫個 wrapper 來把 logger.error 給包裝一下
但是這樣會有個小缺點,實際執行 logger.error 的 function 會變成是 wrapper function
這樣的行為,對於想要紀錄是哪一行程式碼呼叫 logger.error 時
會抓錯位置而導致跑到定義 wrapper function 的地方
或許還有辦法解決,不過我還是忍不住直接使用 PDB++ 來瞧瞧 logger.error 的 source code
意外發現相當容易修改

我的小修改如下:
  • 寫一個 error_hack 直接取代 error,當然是 based on 原本的程式碼作一點點小修改
  • 加上一個將所有 args 參數轉成字串的小功能
  • 在函數的最後加上一個回傳值 False

程式碼及範例如下:
(其實也沒什麼特別的,就是一個小修改,讓我以後方便使用及少寫一點程式碼)


# Modified by joe.dev 
import logging

FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger()
def error_hack(*args, **kwargs):
    if len(args) > 1:                   
        log_str = ""
        for a in args: 
            log_str += str(a) + "  "
    else:
        log_str = str(args)
    logger._log(40, log_str, None, **kwargs)# 40 -> error level
    return False
logger.error = error_hack

def do_some_task():
    return logger.error("Orz 1", "Orz 2", ["Orz 3"], {"Orz 4": "Orz 5"})

if do_some_task() is False:
    print "My task failed"

沒有留言:

張貼留言