存储Python程序执行流程(函数调用流程)

时间:2016-07-20 05:37:42

标签: python mongodb program-flow

我正在开发一个项目,我必须存储在每个请求 - 响应周期中调用的所有函数并存储它们。我不需要存储变量的值,我需要存储的是我们在参数和执行顺序中调用的函数。我正在使用mongodb存储此跟踪。

2 个答案:

答案 0 :(得分:1)

为方便起见,您可以使用函数装饰器。

import functools
import logging

def log_me(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        logging.debug('name: %s, args: %s, kwargs: %s', func.__name__, args, kwargs)                                        
        return func(*args, **kwargs)
    return inner

然后装饰你的功能进行记录。

@log_me
def test(x):
    return x + 2

测试电话。

In [10]: test(3)
DEBUG:root:name: test, args: (3,), kwargs: {}
Out[10]: 5

如果您想直接在MongoDB中存储条目而不是首先登录logging module,则可以使用在数据库中创建条目的代码替换logging.debug行。

答案 1 :(得分:0)

sys.settrace跟踪调试函数,但可以针对此问题进行修改。也许像this -

这样的东西
import sys

def trace_calls(frame, event, arg):
    if event != 'call':
        return
    co = frame.f_code
    func_name = co.co_name
    if func_name == 'write':
        # Ignore write() calls from print statements
        return
    func_line_no = frame.f_lineno
    func_filename = co.co_filename
    caller = frame.f_back
    caller_line_no = caller.f_lineno
    caller_filename = caller.f_code.co_filename
    print 'Call to %s on line %s of %s from line %s of %s' % \
        (func_name, func_line_no, func_filename,
         caller_line_no, caller_filename)

另见profiling。它描述了程序执行的各个部分的频率和持续时间