Python Dramatiq 如何在actor方法中获取message id用于日志记录
Dramatiq actor内部获取当前任务message id的实现方法
首先需要启用Dramatiq内置的CurrentMessage中间件,该中间件会在worker执行任务的过程中维护当前消息的上下文,初始化broker时添加中间件的示例如下:
import dramatiq from dramatiq.middleware import CurrentMessage # 此处以RedisBroker为例,你也可以替换为你使用的其他broker实现 from dramatiq.brokers.redis import RedisBroker broker = RedisBroker() broker.add_middleware(CurrentMessage()) dramatiq.set_broker(broker)
之后在任意actor函数内,调用CurrentMessage.get_current_message()即可拿到当前正在执行的消息实例,直接读取message_id属性即可,你的示例代码修改后如下:
@dramatiq.actor def fn(x, y): current_msg = CurrentMessage.get_current_message() if current_msg: # 此处可替换为你项目使用的日志组件输出 print(f"处理任务,message_id: {current_msg.message_id}") return x + y
注意事项
- 只有通过队列投递、在worker进程中执行的任务,才能拿到有效的消息对象。如果你在本地直接同步调用actor方法(比如直接执行
fn(1,2)而非fn.send(1,2)投递任务),get_current_message会返回None,建议加非空判断避免空指针异常。 - 如果需要所有任务日志都自动携带message_id,可自定义日志过滤器在日志输出时统一注入,不需要每个actor都手动重复写获取逻辑。
内容的提问来源于stack exchange,提问作者learningisfun
相关产品推荐
相关产品推荐

