在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了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 定義 函式體 函...