尽管下面的示例是在Python上编写的,但它并不依赖于python。
我需要每次都传递额外的每个请求信息,例如包含ORM的每个单个日志项的client-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
我们的请求处理器:
# 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?