Can we get the signature or arguments of a celery task on `task_prerun`
Question:
My plan is to log all celery task requests with the arguments they receive s I’m using the following
@task_prerun.connect()
def log_celery_args(task, **kwargs):
logger.info(f"{task.name} {kwargs['kwargs']}", extra=kwargs['kwargs'])
The problem is this solution doesn’t work when the functions don’t use named parameters.
I can get the values from the kwargs['args']
but I’d like to still have in the extras the format
{arg_name: value}
So my idea was if there’s a way to get the signature of a task or any other way to actually get the parameters needed ?
I already tried the following :
- Tried to print all the args of
task
and task.request
to see if I can find it there
- Saw a
signature
function but this one is actually to change it
- Tried to play around
celery.app.trace
to see if I can get it to log with the parameters
Answers:
From Python 3.8 onwards you can use f"{kwargs=}"
to print all keyword arguments.
If positional arguments need to be allowed and logged then the function definition must be adapted as follows:
@task_prerun.connect()
def log_celery_task_call(task, *args, **kwargs):
logger.info(f"{task.name} {args=} {kwargs=}")
*args
in the function definition will catch all positional arguments and **kwargs
all keyword arguments. If there are no positional arguments the args
variable will be an empty list and if no keyword arguments are supplied kwargs
will be an empty dictionary.
See also the Python documentation for function definitions and calls.
My plan is to log all celery task requests with the arguments they receive s I’m using the following
@task_prerun.connect()
def log_celery_args(task, **kwargs):
logger.info(f"{task.name} {kwargs['kwargs']}", extra=kwargs['kwargs'])
The problem is this solution doesn’t work when the functions don’t use named parameters.
I can get the values from the kwargs['args']
but I’d like to still have in the extras the format
{arg_name: value}
So my idea was if there’s a way to get the signature of a task or any other way to actually get the parameters needed ?
I already tried the following :
- Tried to print all the args of
task
andtask.request
to see if I can find it there - Saw a
signature
function but this one is actually to change it - Tried to play around
celery.app.trace
to see if I can get it to log with the parameters
From Python 3.8 onwards you can use f"{kwargs=}"
to print all keyword arguments.
If positional arguments need to be allowed and logged then the function definition must be adapted as follows:
@task_prerun.connect()
def log_celery_task_call(task, *args, **kwargs):
logger.info(f"{task.name} {args=} {kwargs=}")
*args
in the function definition will catch all positional arguments and **kwargs
all keyword arguments. If there are no positional arguments the args
variable will be an empty list and if no keyword arguments are supplied kwargs
will be an empty dictionary.
See also the Python documentation for function definitions and calls.