Celery Worker log 中记录 task_id
import inspect import logging import threading from logging import Logger as Logger, LogRecord from celery import Celery from celery.signals import task_prerun, task_postrun local = threading.local() local.task_id = "" class MyLogger(Logger): def makeRecord(self, *args, **kwargs) -> LogRecord: rv = super().makeRecord(*args, **kwargs) rv.task_id = local.task_id return rv logging.Logger.manager.loggerClass = MyLogger app = Celery() app.conf.update( CELERYD_LOG_FORMAT="[%(asctime)s: %(levelname)s/%(processName)s %(task_id)s %(filename)s:%(lineno)d ] %(message)s" ) @task_prerun.connect def set_task_id(task_id, task, *args, **kwargs): local.task_id = task_id @task_postrun.connect def rm_task_id(task_id, task, *args, **kwargs): local.task_id = "" @app.task def add(x, y): stack = inspect.stack() f_locals = stack[1].frame.f_locals print(f'{getattr(f_locals.get("req", object()), "id", "noid")}') return x + y if __name__ == '__main__': app.worker_main()