Kunal
Kunal

Reputation: 607

Python: multiple loggers write logs into similar file

Based on the requirement, I need to generate separate log file for all input and that will go to separate directory. The code is as follows -

def setup_logger(logger_name, log_filename):
    import logging
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_filename, 'w')
    formatter = logging.Formatter(_FORMAT)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    return logger

this function will be called before processing an input -

logger = None

def foo(input_string):
    global logger
    logger = setup_logger('app', '/opt/data/'+input_string+'.log')

    # do processing and dumping into logs
    # this function will call one recursive function to process data
    logger = None # destroying logger object

if __name__ == "__main__":
    import sys

    for inp in sys.argv[1:]:
        foo(inp)

Now my problem is - in one log file, there are logs for the expected input_string but along with that there will be logs for other input_strings - appended at last. And those logs will also be there in their log files.

Any idea for this weird problem??

Upvotes: 1

Views: 1372

Answers (1)

Nicolas Cortot
Nicolas Cortot

Reputation: 6701

The logger = logging.getLogger(logger_name) call will always return the same Logger object for a given logger_name. What happens here is that you add one more FileHandler to the "app" logger each time you call setup_logger.

Try and remove all handlers first, e.g.:

def setup_logger(logger_name, log_filename):
    import logging
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_filename, 'w')
    formatter = logging.Formatter(_FORMAT)
    file_handler.setFormatter(formatter)

    # Replace the previous handlers with the new FileHandler
    for old_handler in logger.handlers:
        logger.removeHandler(old_handler)
    logger.addHandler(file_handler)

    return logger

Upvotes: 3

Related Questions