1. 程式人生 > 其它 >python 在多個模組中記錄日誌

python 在多個模組中記錄日誌

一、

無論對logging.getLogger('someLogger')進行多少次呼叫,都會返回同一個 logger 物件的引用。不僅在同一個模組內如此,只要是在同一個 Python 直譯器程序中,跨模組呼叫也是一樣。同樣是引用同一個物件,應用程式也可以在一個模組中定義和配置一個父 logger,而在另一個單獨的模組中建立(但不配置)子 logger,對於子 logger 的所有呼叫都會傳給父 logger。

參考連結:https://docs.python.org/zh-cn/3/howto/logging-cookbook.html

二、

問題:python 中封裝日誌 logging,為何列印行號固定在同一行?

答:列印的行號是呼叫 logger 物件的所在行,所以自己進行封裝時,應該返回 logger 物件,再呼叫相應logger.info、logger.debug等方法。

參考連結:https://testerhome.com/topics/26827

三、程式碼示例:

#!/usr/bin/env python
# coding:utf-8

import logging,time
import os

def get_logger(log_path):
    # log_path是存放日誌的路徑,如果不存在這個logs資料夾,那麼需要創建出來。
    # 檔案的命名
    logname = os.path.join(log_path, '
%s.log'%time.strftime('%Y_%m_%d')) logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 日誌輸出格式 formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') # 建立一個FileHandler,儲存日誌檔案 fh = logging.FileHandler(logname, encoding='utf-8
') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) logger.addHandler(fh) # 建立一個StreamHandler,用於輸出到控制檯 sh = logging.StreamHandler() sh.setLevel(logging.DEBUG) sh.setFormatter(formatter) logger.addHandler(sh) return logger if __name__ == '__main__': # log_path是存放日誌的路徑 cur_path = os.path.dirname(os.path.realpath(__file__)) log_path = os.path.join(os.path.dirname(cur_path), '../log') # 如果不存在這個logs資料夾,就自動建立一個 if not os.path.exists(log_path): os.mkdir(log_path) log = get_logger(log_path) log.info(u'基礎資訊') log.debug(u'除錯資訊') log.warning(u'警告資訊') log.error(u'錯誤資訊')

測試程式碼bconfig.py

#!/usr/bin/env python
# coding:utf-8


if __name__ == "__main__":
    from log import get_logger
    log_path = '/root/AutotestV2/log'
    log = get_logger(log_path)
    log.info("run test")

執行測試程式碼bconfig.py結果如下:

可以看到打印出了log.info("run test")所在檔案和行號。

[root@localhost utils]# python bconfig.py 
2022-01-25 18:54:42,386 bconfig.py[line:9] INFO run test