首頁 >後端開發 >Python教學 >使用單一檔案的 Python 日誌記錄(函數名稱、檔案名稱、行號)

使用單一檔案的 Python 日誌記錄(函數名稱、檔案名稱、行號)

PHPz
PHPz轉載
2024-02-08 22:00:211124瀏覽

使用单个文件的 Python 日志记录(函数名、文件名、行号)

問題內容

我正在嘗試了解應用程式的工作原理。為此,我將偵錯命令插入作為每個函數主體的第一行,目的是記錄函數的名稱以及向日誌輸出發送訊息的行號(程式碼內)。最後,由於這個應用程式由許多文件組成,我想建立一個日誌文件,以便我可以更好地理解應用程式的控制流。

這是我所知道的:

  1. 為了取得函數名稱,我可以使用function_name.__name__ 但我不想使用function_name (這樣我就可以快速複製並貼上通用的Log.info("Message") 到正文中所有功能)。我知道這可以使用 __func__ 巨集在 C 中完成,但我不確定 python。

  2. 為了獲取檔案名稱和行號,我已經看到(並且我相信)我的應用程式正在使用Python locals() 函數,但使用的語法我並不完全了解,例如: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals()) 我嘗試使用LOG.info("My message %s" % locals()) 來產生類似 的內容{'self': 0ff8faf8bd88b7016810d18dcbc89724}。對此有任何輸入嗎?

  3. 我知道如何使用日誌記錄並向其添加處理程序以記錄到文件,但我不確定是否可以使用單個文件以項目中函數調用的正確順序記錄所有日誌訊息。


正確答案


您在這裡有一些無關緊要的問題。

我將從最簡單的開始:(3)。使用 logging 您可以將所有呼叫聚合到單一日誌檔案或其他輸出目標:它們將按照進程中發生的順序排列。

下一步:(2)。 locals() 提供目前範圍的字典。因此,在沒有其他參數的方法中,作用域中有 self,其中包含對目前實例的參考。所使用的讓您感到困惑的技巧是使用字典作為 % 運算子的 rhs 的字串格式。 "%(foo)s" % bar 將會被替換為 bar["foo"] 的值。

最後,您可以使用一些自省技巧,類似於 pdb 使用的那些可以記錄更多資訊的技巧:

def autolog(message):
    "Automatically log the current function details."
    import inspect, logging
    # Get the previous frame in the stack, otherwise it would
    # be this function!!!
    func = inspect.currentframe().f_back.f_code
    # Dump the message + the name of this function to the log.
    logging.debug("%s: %s in %s:%i" % (
        message, 
        func.co_name, 
        func.co_filename, 
        func.co_firstlineno
    ))

這將記錄傳入的訊息,加上(原始)函數名稱、定義所在的檔案名稱以及該檔案中的行。有關更多詳細信息,請參閱inspect - 檢查活動物件

正如我之前在評論中提到的,您也可以隨時插入 import pdb; 行,進入 <code>pdb 互動式偵錯提示符。 pdb.set_trace() 中,並重新執行您的程式。這使您能夠逐步執行程式碼,根據您的選擇檢查資料。

以上是使用單一檔案的 Python 日誌記錄(函數名稱、檔案名稱、行號)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除