[Python]使用多個logging如何追蹤呼叫它的函式及行數

更新於 發佈於 閱讀時間約 9 分鐘

呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。

[Python]使用logging創建兩個以上的日誌紀錄

若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式,兩個檔案都是寫一樣的內容,就達不到,我們想要的結果。

raw-image

那要怎麼解呢?


若不是要實現多個logging紀錄器,加上以下程式碼,不要用類別包裝,直接用logging這樣就可以很方便地去使用logging的套件就好。

# 設定日誌格式,包含日期時間、日誌等級、函式名稱、行數及訊息
log_format = "%(asctime)s - %(levelname)s - %(funcName)s - %(lineno)d - %(message)s"

在 Python 中,可以使用 inspect 模組來取得目前被呼叫的函式名稱和行數。

我們利用inspect 模組來實現追蹤呼叫logging的檔案名稱及行數。

完整程式範例

import os
import re
import logging
import inspect
from datetime import datetime

class WriteLogTxt:
'''
setup_logger 設置logging格式及創立文件夾
write_log_info 指定檔案名稱及log內容輸入
write_log_warning
'''
def __init__(self,file_path,file_name):
self.file_path = file_path
self.file_name = file_name

def setup_logger(self):
'''
設置logging格式及創立文件夾
'''
now = datetime.now()
year_month = now.strftime("%Y-%m") #取得字符串
log_folder = os.path.join(self.file_path, year_month)
# 檢查文件夾與文件是否存在
if not os.path.exists(log_folder):
os.makedirs(log_folder)
# 設置格式
# 設定日誌格式,包含日期時間、日誌等級、函式名稱、行數及訊息
log_format = "%(asctime)s - %(levelname)s - %(message)s"
file_handler = logging.FileHandler(os.path.join(log_folder, f"{self.file_name}_{now.date()}.log"))
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(logging.Formatter(log_format))

# 設置logger
self.logger = logging.getLogger(self.file_name)
self.logger.setLevel(logging.INFO)
self.logger.addHandler(file_handler)

# 指定檔案名稱及log內容輸入
def write_log_info(self,log_content):
'''
log_content : Log
'''
# 寫入log
# 獲取呼叫者的資訊
caller_frame = inspect.currentframe().f_back
frame_info = inspect.getframeinfo(caller_frame)
file_path = frame_info.filename
line_number = frame_info.lineno
pattern = r'[^\\]+$'
file_name = re.search(pattern, file_path).group(0)
self.logger.info(f"file_name: [{file_name}],line_number: [{line_number}] {log_content}")

額外開啟兩個py,來呼叫WriteLogTxt撰寫日誌紀錄

取名為module_1.py與module_2.py

from test import WriteLogTxt

#調用第一個log_obj寫入log
log_obj = WriteLogTxt('D:/CRABpy/write/log','sample_1')
log_obj.setup_logger()
log_obj.write_log_info('test_1')
from test import WriteLogTxt

#調用第二個log_obj寫入log
log_obj_2 = WriteLogTxt('D:/CRABpy/write/log','sample_2')
log_obj_2.setup_logger()
log_obj_2.write_log_info('test_2')
raw-image

成功實現了,追蹤呼叫logging的檔案名稱及行數。

主要是新增了以下程式碼

# 獲取呼叫者的資訊
caller_frame = inspect.currentframe().f_back
frame_info = inspect.getframeinfo(caller_frame)
file_path = frame_info.filename
line_number = frame_info.lineno
pattern = r'[^\\]+$'
file_name = re.search(pattern, file_path).group(0)

詳細說明

  • 獲取當前框架:
    caller_frame = inspect.currentframe().f_back
    inspect.currentframe() 函式返回當前的堆疊框架物件。f_back 屬性指向上一個堆疊框架,這裡的 caller_frame 即為呼叫當前函式的框架。
  • 獲取框架資訊:
    frame_info = inspect.getframeinfo(caller_frame)
    inspect.getframeinfo(frame) 函式接收一個框架物件並返回一個包含檔案名稱、行數、函式名稱等資訊的物件。這裡的 frame_info 包含呼叫函式所在的檔案名稱和行數。
  • 提取檔案路徑:
    python複製程式碼file_path = frame_info.filename
    frame_info.filename 返回呼叫函式的檔案路徑。
  • 提取行數:
    line_number = frame_info.lineno
    frame_info.lineno 返回呼叫函式所在的行數。
  • 定義正規表達式模式:
    pattern = r'[^\\]+$'
    這個正規表達式模式 [^\\]+$ 匹配最後一個反斜杠(\)之後的所有字符,直到字符串的結尾。具體來說:
    • [^\\] 匹配任何不是反斜杠的字符。
    • + 匹配前一個字符集合的一次或多次出現。
    • $ 匹配字符串的結尾。
  • 應用正規表達式提取檔案名稱:
    file_name = re.search(pattern, file_path).group(0)
    re.search(pattern, file_path) 尋找符合模式的第一個匹配,返回一個 Match 物件。group(0) 返回整個匹配的字符串,即檔案名稱。

這段程式碼的目的是從呼叫函式的框架中提取檔案名稱和行數,並使用正規表達式從完整檔案路徑中擷取出檔案名稱。例如,給定完整路徑 'f:\\python\\opencv\\pathinputdata\\module_1.py',它會提取出 module_1.py


留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
149會員
293內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/04/15
在軟體開發或部署過程中,我們經常需要對多個 .ini 設定檔進行批次修改,例如將某個舊的參數名稱或路徑名稱,替換成新的命名。 這就像記事本的「全部取代」功能,但你不需要一個個打開檔案慢慢點——你可以用 Python 自動完成這些事! 本文將介紹一個 Python 函式:search_and_re
2025/04/15
在軟體開發或部署過程中,我們經常需要對多個 .ini 設定檔進行批次修改,例如將某個舊的參數名稱或路徑名稱,替換成新的命名。 這就像記事本的「全部取代」功能,但你不需要一個個打開檔案慢慢點——你可以用 Python 自動完成這些事! 本文將介紹一個 Python 函式:search_and_re
2025/04/11
🐶 什麼是 Watchdog? Watchdog 是一個 Python 套件,用來即時監控檔案系統的變化。它可以在資料夾內有「新增」、「修改」、「刪除」等事件時,立即觸發事件處理函式,不需要手動輪詢 (polling),效率高又省資源。 ✅ Watchdog 的特點: 採用 OS 層級的檔案
2025/04/11
🐶 什麼是 Watchdog? Watchdog 是一個 Python 套件,用來即時監控檔案系統的變化。它可以在資料夾內有「新增」、「修改」、「刪除」等事件時,立即觸發事件處理函式,不需要手動輪詢 (polling),效率高又省資源。 ✅ Watchdog 的特點: 採用 OS 層級的檔案
2025/01/12
用 PyInstaller 打包一個簡單計算機應用 (GUI 使用 PyQt5) 本教學將帶您使用 PyQt5 建立一個簡單的計算機應用,並透過 PyInstaller 將其打包成執行檔(EXE)。 1. 安裝所需環境 在開始之前,請確保您已安裝以下工具: 必要套件 Python: 建
Thumbnail
2025/01/12
用 PyInstaller 打包一個簡單計算機應用 (GUI 使用 PyQt5) 本教學將帶您使用 PyQt5 建立一個簡單的計算機應用,並透過 PyInstaller 將其打包成執行檔(EXE)。 1. 安裝所需環境 在開始之前,請確保您已安裝以下工具: 必要套件 Python: 建
Thumbnail
看更多
你可能也想看
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
Thumbnail
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News