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

2021-08-19 20:26:38 字數 3164 閱讀 5863

目錄

二、錯誤詳細的日誌資訊列印

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