Python 在异步编程中记录额外信息

Python 在异步编程中记录额外信息,python,python-3.x,asynchronous,logging,Python,Python 3.x,Asynchronous,Logging,尽管下面的示例是用Python编写的,但它并不是如此依赖Python 我每次都需要传递额外的每个请求信息,比如每个日志项(包括ORM)的客户端id,而不需要修改我们使用的每个库和应用程序 使用同步编程,正如您在下面的示例中所看到的,它很容易,因为我们可以创建额外的来传递,并在每个请求中修改额外的一次。但是在异步编程中,当这种技术变得无用时,该怎么办呢 这里的示例代码是在Python上编写的,因为这是说明问题的最简单方法,但问题本身与语言无关 记录器配置文件: # logging_config.p

尽管下面的示例是用Python编写的,但它并不是如此依赖Python

我每次都需要传递额外的每个请求信息,比如每个日志项(包括ORM)的客户端id,而不需要修改我们使用的每个库和应用程序

使用同步编程,正如您在下面的示例中所看到的,它很容易,因为我们可以创建额外的来传递,并在每个请求中修改额外的一次。但是在异步编程中,当这种技术变得无用时,该怎么办呢

这里的示例代码是在
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日志以及来自其他自定义库的日志添加额外的内容