我有一个web应用程序,我想添加日志(但我觉得这是更普遍适用的)。大多数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
。由于大多数函数/方法与客户机逻辑无关,因此在那里添加pass-through参数感觉不对
另一种方法是使用全局变量来保存“最近的客户机”,但是全局变量几乎总是一个错误的选择,尤其是在使用多线程和/或异步代码(我正在使用)时
有什么办法可以解决这个问题吗?理想情况下,我想要
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')
但这感觉就像访问“私人”数据。有没有一种干净的方法来完成这个任务
如果有帮助的话:web应用程序是用Sanic编写的,这是一个基于asyncio的web框架。日志记录是使用标准python记录器工具完成的
可能不完全是您所需要的,但从以前的工作中我记得中间件添加了请求uuid和响应uuid到api调用的日志中
您可以编写中间件,在链的开头为您的请求添加一个唯一的id,然后将请求传递出去,就像sanic在路由到端点函数/方法时所做的那样
我记得elasticsearch日志以前是这样的:
requests-2018-01-01节点
回复-2018-01-01
它使得查看日志变得很容易,因为您可以通过内部日志、请求日志、响应日志等中的请求id进行搜索
希望有帮助
相关问题 更多 >
编程相关推荐