Python 在异步编程中记录额外信息
尽管下面的示例是用Python编写的,但它并不是如此依赖Python 我每次都需要传递额外的每个请求信息,比如每个日志项(包括ORM)的客户端id,而不需要修改我们使用的每个库和应用程序 使用同步编程,正如您在下面的示例中所看到的,它很容易,因为我们可以创建额外的来传递,并在每个请求中修改额外的一次。但是在异步编程中,当这种技术变得无用时,该怎么办呢 这里的示例代码是在Python 在异步编程中记录额外信息,python,python-3.x,asynchronous,logging,Python,Python 3.x,Asynchronous,Logging,尽管下面的示例是用Python编写的,但它并不是如此依赖Python 我每次都需要传递额外的每个请求信息,比如每个日志项(包括ORM)的客户端id,而不需要修改我们使用的每个库和应用程序 使用同步编程,正如您在下面的示例中所看到的,它很容易,因为我们可以创建额外的来传递,并在每个请求中修改额外的一次。但是在异步编程中,当这种技术变得无用时,该怎么办呢 这里的示例代码是在Python上编写的,因为这是说明问题的最简单方法,但问题本身与语言无关 记录器配置文件: # logging_config.p
Python
上编写的,因为这是说明问题的最简单方法,但问题本身与语言无关
记录器配置文件:
# logging_config.py
extra = {
'application': None,
'client_id': None
}
# use custom logstash formatter to send this extra
#!/usr/bin/env python3
import logging
import our_lib.logging_config as log_cfg
log = logging.getLogger(__name__)
def application_setup():
""" Sets up application and logging. """
log_cfg['application'] = 'OurWebApplication'
... # do the rest here
我们的主要申请文件:
# logging_config.py
extra = {
'application': None,
'client_id': None
}
# use custom logstash formatter to send this extra
#!/usr/bin/env python3
import logging
import our_lib.logging_config as log_cfg
log = logging.getLogger(__name__)
def application_setup():
""" Sets up application and logging. """
log_cfg['application'] = 'OurWebApplication'
... # do the rest here
我们的请求处理器:
# api_handler.py
import logging
log = logging.getLogger(__name__)
... # rest of the file
def extract_client_id(request):
""" Extracts Client ID from request or session. """
...
# some web API request handle
@route('/api/do_smth')
def api_do_smth_handler(request):
""" Handles `do_smth` web request. """
log_cfg.extra['client_id'] = extract_client_id(request)
...
一些库模块:
import logging
log = logging.getLogger(__name__)
def process_data(*args, **kwargs):
""" Processes arguments. """
try:
... # process arguments
except MyException:
log.exception("argument processing failed") # <-- how to log client ID here?
导入日志
log=logging.getLogger(_名称__)
def过程_数据(*args,**kwargs):
“”“处理参数。”“”
尝试:
... # 过程参数
除了我的例外:
log.exception(“参数处理失败”)#我看不出在异步环境中会有什么不同。是因为extract\u client\u id也是一个异步调用吗?这在node/express中使用中间件很容易处理。在一个异步的Python环境中,使用类似的东西很容易处理。差异将在执行流程中,而不是在逻辑中。例如,如果我们保存这个逻辑,一个请求就在另一个请求的中间开始(对于异步编程本身来说是这样)。我们将记录错误的数据。非常高级别的异步框架将使您能够在整个请求/响应周期中访问稳定的请求。再次查看一些节点文档。您担心的是一个不存在的问题。我需要向所有ORM日志以及来自其他自定义库的日志添加额外的内容。我看不出在异步环境中会有什么不同。是因为extract\u client\u id也是一个异步调用吗?这在node/express中使用中间件很容易处理。在一个异步的Python环境中,使用类似的东西很容易处理。差异将在执行流程中,而不是在逻辑中。例如,如果我们保存这个逻辑,一个请求就在另一个请求的中间开始(对于异步编程本身来说是这样)。我们将记录错误的数据。非常高级别的异步框架将使您能够在整个请求/响应周期中访问稳定的请求。再次查看一些节点文档。您担心的是一个不存在的问题。我需要向所有ORM日志以及来自其他自定义库的日志添加额外的内容