目錄
二、錯誤詳細的日誌資訊列印
在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了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
deftrace_caller
(laynum):
cur_func_name = inspect.currentframe()
cur_func_name = inspect.getouterframes(cur_func_name, 2)
print(cur_func_name)
列印結果如下:
[(0x04dc2b70>, '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),
(0x04dd5380>, '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),
(0x04b0c6b0>, '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):
deftest_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 error函式中的logger.中的位置。...
Python 基礎 函式引數及呼叫
函式中return返回值功能 這次是要來說明一下,return到底在函式中有什麼作用 usr bin env python3 coding utf 8 def test1 print in the test1 return 0 print test end test 執行結果 in the test...
Python 函式的定義 引數及呼叫
定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。如果你已經把my abs 的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import...