【问题标题】:Accessing data from calling function: logging original source of function call从调用函数访问数据:记录函数调用的原始来源
【发布时间】:2017-09-25 15:34:42
【问题描述】:

我有一个想要添加日志记录的网络应用程序(但我觉得这更普遍适用)。大多数 HTTP 请求不需要记录,但某些操作会导致生成外部调用,这些应该被记录。

单个传入的 HTTP 请求可以启动 0 个或多个后端请求,我想记录这些后端请求的来源,以便可以追溯到原始调用。

我的幼稚做法是在整个调用链中添加一个“客户端 ID”,如下所示:

def do_something_log_worthy(client_id, parameters):
    logger.info("{source}: caused something to be done".format(client_id))
    # something

def generic_intermediate_func_1(client_id, parameters):
    if unusual_case(parameters):
        do_something_log_worthy(client_id, parameters)

# ... some more levels generic wrappers

def http_request(client_id, request):
    # Here I get the actual client ID
    generic_intermediate_func_N(client_id, "foo", "bar")

虽然这可行,但我想避免在整个调用链中添加client_id。由于大部分函数/方法与客户端逻辑无关,所以在那里添加传递参数感觉不对。

另一种方法是使用全局变量来保存“最新客户端”,但全局变量几乎总是一个不好的选择,尤其是在使用多线程和/或异步代码(我正在使用)时。

有解决这个问题的pythonic方法吗?理想情况下,我想要类似的东西

logger.info("{source}: foobar".format(
    call_stack.nearest_frame_decorated_with(some_decorater).get_variable_value("client_id")
))  # all entry-points are decorated with @app.route('/path/to/foo')

但这感觉就像访问“私人”数据。有没有办法以干净的方式完成此任务?

如果有帮助:网络应用程序是用Sanic 编写的,这是一个基于异步的网络框架。使用标准 python 记录器工具完成记录。

【问题讨论】:

    标签: python logging introspection sanic


    【解决方案1】:

    可能不完全是您所需要的,但在以前的工作中,我记得中间件添加了请求 uuid 和响应 uuid 以登录 api 调用。

    您可以编写中间件,在链的开头为您的请求添加一个唯一 id,然后传递请求,就像 sanic 对端点函数/方法的路由一样。

    我记得以前的 elasticsearch 日志是这样的:

    requests-2018-01-01 节点

        {
    "timestamp": "Sun Jan 01 16:13:39 SAST 2018",
    "payload": "{'user_id':'abcdef', 'action': 'calculate_balance'}
    "request_id": "03cfd743661f07975fa2f1220c5194cbaff48451",
    "status": 500
    }
    

    response-2018-01-01

    {
    "timestamp": "Sun Jan 01 16:13:39 SAST 2018",
    "message": "Internal Server Error"
    "request_id": "03cfd743661f07975fa2f1220c5194cbaff48451",
    "response_id": "3330b4373640f9e4604991e73c7e86bfd8da2dc3",
    "status": 500
    }
    

    它使查看日志变得容易,因为您可以在内部日志、请求日志、响应日志等中按请求 ID 进行搜索。

    希望有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2021-11-03
      • 1970-01-01
      相关资源
      最近更新 更多