将关联或跟踪 ID 添加到 Python 日志调用

din*_*gus 6 python logging

给定一个使用标准库日志记录的 Python 复杂应用程序,如下所示:

import logging

logger = logging.getLogger("mycomponent")

# (Split over multiple Python files/folders of course)

def do_a_really_specific_thing(x):
    if isinstance(x, int):
        logger.info("I'm doing a thing! %s", x)
        return 2 * x
    else:
        logger.error("Ignoring non-integer value %s", x)
        return 0

def run_a_task(task_input):
    return do_a_really_specific_thing(task_input.x)

def process_a_transaction(req):
    y = run_a_task(req.data)
    result = y + 1
    logger.info("Processed transaction %s", req.txn_id)
    return result
Run Code Online (Sandbox Code Playgroud)

是否有一些标准模式,无需编辑内部函数的代码do_a_really_specific_thing(),即可logging使用跟踪或相关 ID 等附加信息来装饰上下文中引发的任何标准事件?

我正在思考以下内容:

def process_a_transaction(req):
    with decorate_logs(txn_id=req.txn_id):
        y = run_a_task(req.data)
    return y + 1
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常标准的想法,但我遇到的文章似乎都涉及引入一些大型日志框架或其他工具。例如,此处使用 Datadog此处使用 SolarWinds AppOptics

Vin*_*jip 0

stdlib 开箱即用的日志记录支持这一点,并记录在日志记录手册(Python 文档的一部分)中。具体来说,您可以使用一个LoggerAdapter或一个日志过滤器来传递此类附加信息。说明书示例涉及网络应用程序的对等 IP 地址,但它可以以相同的方式用于事务 ID。