python - 记录协程感知变量

标签 python python-3.x logging python-asyncio

我正在遵循 asyncio.Queue 中给出的 worker 示例。在 worker_task() 调用的函数中,我想记录当前工作人员的姓名,而不必在任何地方传递它。

我怀疑通过 LoggerAdapterContextVar 的某种组合,它可以做我想做的事情。

接下来的事情......

import logging
logging.basicConfig(format="%(worker_name)s %(message)s")
logger = logging.getLogger(__name__)

async def sub_function():
    logger.info("a message") # worker-1: a message

async def worker_task(queue, worker_name):
    logger.do_something(worker_name) # HELP HERE PLEASE
    await sub_function()

queue = asyncio.Queue()

workers = [
    loop.create_task(worker_task(queue, "worker-1"),
    loop.create_task(worker_task(queue, "worker-2"),
]

最佳答案

你可以使用这样的东西:

import logging
import asyncio
from contextvars import ContextVar

WorkerName = ContextVar('worker_name')

logging.basicConfig(format='%(worker_name)s %(message)s', level=logging.INFO)

class WorkerAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        kwargs.setdefault('extra', {})['worker_name'] = WorkerName.get()
        return msg, kwargs

logger = WorkerAdapter(logging.getLogger(__name__), None)


async def sub_function():
    logger.info('a message')

async def worker_task(worker_name):
    WorkerName.set(worker_name)
    await sub_function()

loop = asyncio.get_event_loop()

workers = [
    loop.create_task(worker_task('worker-1')),
    loop.create_task(worker_task('worker-2')),
]

loop.run_until_complete(asyncio.gather(*workers))

关于python - 记录协程感知变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55068373/

相关文章:

python - 阴谋冲刺 : Time Series Scatter plot rendering

python - 如何使字段仅在 ODOO 中保存记录后才可编辑

python - 写入文件后从文件中读取行

python - 由于串口打开情况,无法从 Arduino 和无线调制解调器读取串行数据

python - 如何比较 itertools.combinations 中的元素?

tomcat - Hudson 日志进入 stderr 并且也没有滚动

Python Pandas 只比较相同标签的 DataFrame 对象

java - 如何使用 log4j2.xml 配置 hibernate 日志记录?

c++ - 如何将 Boost.Log 重定向到文件

python - 在二叉树中找到最接近给定目标的数字