Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Celery Logging: consistent way to log inside and outside of a task

I'm running a Celery task that executes a function. This function generates some logging information. Using the get_task_logger logger, I am able print the logging information to the Celery stdout.

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")

However, I also want to import this function as a normal python script (not using Celery) and log to, for example, stdout. Normally, I might do something like the following:

import logging
logger = logging.getLogger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")

How do I combine both approaches so I don't have to do something redundant like the following?

import logging
from celery.utils.log import get_task_logger
logger = logging.getLogger(__name__)
logger_celery = get_task_logger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")
    logger_celery.debug("SOME OUTPUT HERE")

Summary: If I call the function from a celery task, I'd like it to log to the celery worker stdout. If I call the function from a normal Python prompt, it would use the normal Python logger. Any help is much appreciated.

like image 607
Joe J Avatar asked Jun 11 '15 21:06

Joe J


1 Answers

You can pass an optional argument to that function.

import logging
from celery.utils.log import get_task_logger


def my_func_called_inside_a_task(use_celery_logger=None):
    if use_celery_logger:
        logger = get_task_logger(__name__)
    else:
        logger = logging.getLogger(__name__)

    logger.debug("SOME OUTPUT HERE")

and in Your celery task call it as

my_func_called_inside_a_task(use_celery_logger=True)

and for normal logging you can call it as it is

my_func_called_inside_a_task()
like image 114
Pandikunta Anand Reddy Avatar answered Oct 23 '22 02:10

Pandikunta Anand Reddy