python追溯函式的呼叫及錯誤日誌詳細列印教程

2021-12-29 21:46:43 字數 2836 閱讀 7708

在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了print_log_info以及print_log_error中。但是如果在上述函式中直接通過logger.*列印日誌,日誌中的模組名、行號就會一直列印print_log_info和print_log_error函式中的logger.*中的位置。所以有了追溯函式呼叫的想法,在列印正常日誌時,列印對應模組名以及列印日誌語句的行號。

在乙個模組中呼叫print_log_info函式,在print_log_info函式中呼叫了trace_caller函式,trace_caller函式定義如下:

import inspect

def trace_caller(laynum):

cur_func_name = inspect.currentframe()

cur_func_name = inspect.getouterframes(cur_func_name, 2)

print(cur_func_name)列印結果如下:

[(, 'c:\\users\\think\\pycharmprojects\\inte***ceframe\\src\\utils\\utils.py', 19, 'trace_caller', [' cur_func_name = inspect.currentframe()\n', ' cur_func_name = inspect.getouterframes(cur_func_name, 2)\n'], 1),

(, 'c:\\users\\think\\pycharmprojects\\inte***ceframe\\src\\utils\\utils.py', 62, 'print_log_info', [' print(msg) # 在htmltestrunner列印測試報告,用例執行成功,不可能觸發斷言,所以需要列印msg\n', ' caller_module, msg_lineno = trace_caller(2)\n'], 1),

(, 'c:/users/think/pycharmprojects/inte***ceframe/src/inte***cetest.py', 18, '', ['\n', ' utils.print_log_info("最後呼叫tracecall函式")\n'], 1)]

可以看到列印結果是乙個列表,列表中的元素是三個元組,我們重點從每個元素的第2個元素開始關注,發現分別是呼叫print(cur_func_name)以及上一級呼叫語句的模組所在路徑、**行數、函式名、以及列印語句。所以我們根據需要取cur_func_name 對應元素的值就可以達到我們想要的效果了。

def trace_caller(laynum):

'''根據傳遞的laynum追溯函式呼叫者所在的模組、行數。目前只能在列印日誌函式中使用

:param laynum:追溯層數,由於在列印日誌函式中呼叫本函式,追溯層數為2,

:return:模組名, 列印日誌所在行號

'''cur_func_name = inspect.currentframe()

cur_func_name = inspect.getouterframes(cur_func_name, 2)

caller_module = cur_func_name[laynum][1][len(settings.project_dir)+1:]

msg_lineno = cur_func_name[laynum][2]

return caller_module, msg_lineno通過上述方式,可以追溯到函式的呼叫過程,但最多只能追溯到列印日誌的logger.info()等語句。如果想要列印出錯行的**,就需要再採用其他方式了。也就是traceback模組

使用traceback模組,可以實現對出錯日誌的詳細輸出,但是需要結合try except語句來使用,單獨使用會報錯。使用案例如下:

class testexample(unittest.testcase):

def test_add(self):

result = test(2, 2).add()

try:

self.assertequal(result, 3, "加法錯誤,請重新輸入")

utils.print_log_info("測試成功")

except assertionerror as err:

err_str = traceback.format_exc()

utils.print_log_error(err_str)

raise err列印日誌

2018-04-25 wednesday 21:48:47 - error -mainthread:42464 - src\test\case\testexample.py : 16 traceback (most recent call last):

file "c:\users\think\pycharmprojects\inte***ceframe\src\test\case\testexample.py", line 12, in test_add

self.assertequal(result, 3, "加法錯誤,請重新輸入")

file "c:\python33\lib\unittest\case.py", line 641, in assertequal

assertion_func(first, second, msg=msg)

file "c:\python33\lib\unittest\case.py", line 634, in _baseassertequal

raise self.failureexception(msg)

assertionerror: 4 != 3 : 加法錯誤,請重新輸入

python之追溯函式呼叫及錯誤日誌詳細列印

目錄 二 錯誤詳細的日誌資訊列印 在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了print log info以及print log error中。但是如果在上述函式中直接通過logger.列印日誌,日誌中的模組名 行號就會一直列印print log info和print log erro...

Python 函式的定義 引數及呼叫

定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。如果你已經把my abs 的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import...

python中函式的定義及呼叫

1 函式的概念 函式是將具有獨立功能的 塊組織為乙個整體,使其具有特殊功能的 集 2 函式的作用 使用函式可以加強 的復用性,提高程式編寫的效率 3 函式的使用 函式必須先建立才可以使用,該過程稱為函式的定義,函式建立後可以使用,使用過程稱為函式呼叫 def 函式名 形參1,形參2 定義 函式體 函...