I am using the logging module to output what used to be print statements in my script to both the console and a log file. However, each time I run the script, the output seems to append to what was printed in the console and the log, rather than overwrite what was there. For example, the first time I run the script I get this output in my console and log file:
This print statement is going to both the console and the log
The year is: 2015
The second time I run the script, I get this in the console:
This print statement is going to both the console and the log
This print statement is going to both the console and the log
The year is: 2015
The year is: 2015
The third time:
This print statement is going to both the console and the log
This print statement is going to both the console and the log
This print statement is going to both the console and the log
The year is: 2015
The year is: 2015
The year is: 2015
etc.. and the log file keeps appending so that I end up with:
This print statement is going to both the console and the log
The year is: 2015
This print statement is going to both the console and the log
This print statement is going to both the console and the log
The year is: 2015
The year is: 2015
This print statement is going to both the console and the log
This print statement is going to both the console and the log
This print statement is going to both the console and the log
The year is: 2015
The year is: 2015
The year is: 2015
What I want is for both the log file and the console to only give me the following, no matter how many times I rerun the script:
This print statement is going to both the console and the log
The year is: 2015
Note: the only way I can currently get what I want is to shut down Python in between runs of the script, but that is not a practical solution.
I have experimented with using flush() and have tried doing something like this:
logger = logging.basicConfig(filemode='w', level=logging.DEBUG)
but I have not been able to get it to work with my code. Can someone please help? Here is my code:
import inspect
import logging
import datetime
def getDate():
now = datetime.datetime.now()
m = now.month
d = now.day
y = str(now.year)
if m < 10:
m = "0"+str(m)
else:
m = str(m)
if d < 10:
d = "0"+str(d)
else:
d = str(d)
y = y[2:]
formatted_date = m+d+y
return formatted_date
def function_logger(file_level, console_level = None):
function_name = inspect.stack()[1][3]
logger = logging.getLogger(function_name)
logger.setLevel(logging.DEBUG) #By default, logs all messages
if console_level != None:
ch = logging.StreamHandler() #StreamHandler logs to console
ch.setLevel(console_level)
ch_format = logging.Formatter('%(message)s')
ch.setFormatter(ch_format)
logger.addHandler(ch)
log_name = 'Test_log' + getDate() + '.log'
fh = logging.FileHandler(log_name.format(function_name))
fh.setLevel(file_level)
fh_format = logging.Formatter('%(message)s')
fh.setFormatter(fh_format)
logger.addHandler(fh)
return logger
def f1():
global logger
year = '2015'
logger.info("The year is: %s" % (year))
def main():
global logger
logger = function_logger(logging.INFO, logging.INFO)
logger.info('This print statement is going to both the console and the log')
f1()
logging.shutdown()
if __name__ == '__main__':
main()
See Question&Answers more detail:
os