How to create a new log file every time the application runs?
logging.handlers.RotatingFileHandler
rotates your logs based either on size or on date, but you can force it to rotate using RotatingFileHandler.doRollover()
so something like:
import logging.handlers
import os
filename = "example.log"
# your logging setup
should_roll_over = os.path.isfile(filename)
handler = logging.handlers.RotatingFileHandler(filename, mode='w', backupCount=5)
if should_roll_over: # log already exists, roll over!
handler.doRollover()
# the rest of your setup...
Should work like a charm.
Related videos on Youtube
practicemakesperfect
Updated on June 27, 2022Comments
-
practicemakesperfect over 1 year
Currently, this is what I have (
testlog.py
):import logging import logging.handlers filename = "example.log" logger = logging.getLogger() logger.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler = logging.handlers.RotatingFileHandler(filename, mode = 'w', backupCount = 5) handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) logger.addHandler(handler) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) logger.addHandler(ch) for i in range(10): logger.debug("testx") #where I alternate x from 1 thru 9 to see output
It currently successfully prints out to the console and to
example.log
, which is what I want.Every time I run it, it makes a new file and replaces the old
example.log
like so:run with
logger.debug("test1")
-example.log
will containtest1
10 times like it should.run with
logger.debug("test2")
- it rewritesexample.log
to containtest2
10 times.etc...
However, I would like for the code to make a new log file every time I run the program so that I have:
example.log example.log1 example.log2 ... example.log5
In conclusion, I'd like for this file to print the log message to the console, to the log file, and I would like a new log file (up to *.5) whenever I run the program.
-
practicemakesperfect over 6 yearsSOLVED! all I did was add
logging.handlers.RotatingFileHandler.doRollover(handler)
at the end -
zwer over 6 yearsDon't do it at the end - if your script fails mid-point end doesn't reach the end you won't be getting the new log file on the next start. Do it when initializing your logging.
-
ybonda about 3 yearsit creates empty log files on each run
-
Dman Cannon almost 3 yearsset
delay
= True, it avoids creation of empty log files -
Vrishank over 2 yearsHow do I add a timestamp instead of .log.1, .log.2 ?
-
zwer over 2 years@Vrishank
RotatingFileHandler
uses the base filename to determine the rotated log name, you cannot set it to use timestamps or anything else except the<base_name>.<n>
for its rotated files. That being said, this being Python, you can always override the internals to have it do your bidding, you can check out one way to do it in this answer. -
Andrei over 1 year@ybonda, it works for me if I remove mode = 'w' from RotatingFileHandler