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

时间:2017-04-08 19:54:29

标签: python python-3.x asynchronous logging

尽管下面的示例是在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? 

0 个答案:

没有答案