The celery 3.x docs on logging recommend to set up the task logger like so:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
When I do that, CELERYD_TASK_LOG_FORMAT is ignored and the log statements use CELERYD_LOG_FORMAT instead, where I cannot make use of %(task_name)s and %(task_id)s.
My task is in a module tasks in my app myapp. Therefore, __name__ is myapp.tasks.
I assume the problem are these lines in celery/utils/log.py:
def get_task_logger(name):
    logger = get_logger(name)
    if logger.parent is logging.root:
        logger.parent = task_logger
    return logger
So for whatever reason, the module passed to get_task_logger() has to be a first level module, otherwise the task logger is not attached. There is no comment explaining why this has to be the case (and I can't think of any reason why you would add this restriction, really). __name__ doesn't work because it references a second level module.
Am I making a mistake or are the docs just wrong? If so, what am I supposed to pass to get_task_logger() instead?
As of 2014-10-05, this is no longer the case. Passing __name__ now seems to work fine (current implementation).
Just remember that your task loggers will still be forced to inherit from celery.task. Its parent logger celery does not propagate to the root logger by default, so you might want to define a logger for celery.task in your logging configuration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With