Reputation: 607
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
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