除了傳遞給日志記錄函數(shù)的參數(shù)(如msg)外,有時(shí)候我們還想在日志輸出中包含一些額外的上下文信息。比如,在一個(gè)網(wǎng)絡(luò)應(yīng)用中,可能希望在日志中記錄客戶端的特定信息,如:遠(yuǎn)程客戶端的IP地址和用戶名。這里我們來介紹以下幾種實(shí)現(xiàn)方式:

  • 通過向日志記錄函數(shù)傳遞一個(gè)extra參數(shù)引入上下文信息

  • 使用LoggerAdapters引入上下文信息

  • 使用Filters引入上下文信息

一、通過向日志記錄函數(shù)傳遞一個(gè)extra參數(shù)引入上下文信息


前面我們提到過,可以通過向日志記錄函數(shù)傳遞一個(gè)extra參數(shù)來實(shí)現(xiàn)向日志輸出中添加額外的上下文信息,如:

import loggingimport sys

fmt = logging.Formatter("%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s")
h_console = logging.StreamHandler(sys.stdout)
h_console.setFormatter(fmt)
logger = logging.getLogger("myPro")
logger.setLevel(logging.DEBUG)
logger.addHandler(h_console)

extra_dict = {"ip": "113.208.78.29", "username": "Petter"}
logger.debug("User Login!", extra=extra_dict)

extra_dict = {"ip": "223.190.65.139", "username": "Jerry"}
logger.info("User Access!", extra=extra_dict)

輸出:

2017-05-14 15:47:25,562 - myPro - 113.208.78.29 - Petter - User Login!
2017-05-14 15:47:25,562 - myPro