Rotate logfiles each time the application is started (Python) Rotate logfiles each time the application is started (Python) python python

Rotate logfiles each time the application is started (Python)


I might be enough to use RotatingFileHandler without maxBytes, then call doRollover() on application start.

Yup, seems to work fine. The code below will create a new log file on each application run, with added timestamps for log start and close times. Running it will print the list of available log files. You can inspect them to check correct behavior. Adapted from the Python docs example:

import osimport globimport loggingimport logging.handlersimport timeLOG_FILENAME = 'logging_rotatingfile_example.out'# Set up a specific logger with our desired output levelmy_logger = logging.getLogger('MyLogger')my_logger.setLevel(logging.DEBUG)# Check if log exists and should therefore be rolledneedRoll = os.path.isfile(LOG_FILENAME)# Add the log message handler to the loggerhandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, backupCount=50)my_logger.addHandler(handler)# This is a stale log, so roll itif needRoll:        # Add timestamp    my_logger.debug('\n---------\nLog closed on %s.\n---------\n' % time.asctime())    # Roll over on application start    my_logger.handlers[0].doRollover()# Add timestampmy_logger.debug('\n---------\nLog started on %s.\n---------\n' % time.asctime())# Log some messagesfor i in xrange(20):    my_logger.debug('i = %d' % i)# See what files are createdlogfiles = glob.glob('%s*' % LOG_FILENAME)print '\n'.join(logfiles)


Simplest way is just to have a date tag in log file name, so when you start app each time you will get a new log file.

e.g.

dateTag = datetime.datetime.now().strftime("%Y-%b-%d_%H-%M-%S")logging.basicConfig(filename="myapp_%s.log" % dateTag, level=logging.DEBUG)

so each time you will have log like myapp_2011-Jan-11_12-27-29.log

Another benefit is that you can mix this with RotatingFileHandler to have separate log for each app invocation, where each log itself is further divided into multiple fixed size logs.


Log Rotation and RoatatingFileHandler are usually designed and desirable when the application is running for a very long time (days) and you want the log to keep rotation. Under cases where I have to rotate the log upon restart of the application, I had to do that outside of the Logfile handler, which was easier. It was like, before the log writer call for the first time, I would see if the log file already existed, and if yes, rename it and create a new log file. The renaming should be differentiated from the handler's renaming mechanism.