Irina
Irina

Reputation: 1598

Python File Handler with Rotating Content of File

I have written a simple logging program that attaches anything I send to it to a file:

def log(message):
    with open ("log.txt", 'a+') as f:
        f.write(message + "\n")

However, I would like to limit how big this file gets. When it gets to the maximum size, I would like for it to remove the first lines and append at the bottom.

Is this possible with a file handler or do I need to code it myself? I am also fine using a rotating file handler, but all the examples I have seen let the environment write exceptions automatically after setting a level, and I need to control what is written to the file.

Many thanks in advance!

Upvotes: 5

Views: 3161

Answers (1)

PirateNinjas
PirateNinjas

Reputation: 2076

This is an example of using python's built in RotatingFileHandler:

import logging
from logging.handlers import RotatingFileHandler

# change to a file you want to log to
logFile = 'log_r.log'

my_handler = RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024,
                                 backupCount=2, encoding=None, delay=0)
my_handler.setLevel(logging.INFO)

app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)
app_log.addHandler(my_handler)


def bad():
    raise Exception("Something bad")


if __name__ == "__main__":
    app_log.info("something")
    try:
        app_log.info("trying to run bad")
        bad()
    except Exception as e:
        app_log.info("That was bad...")
    finally:
        app_log.info("Ran bad...")

The behaviour is slightly different to your proposed behaviour as it doesn't delete from the start of the file, instead moving the file to a different filename and starting from scratch.

Note that the only things that show in the log file when you run this are the pieces of text we're logging explicitly - i.e. no system junk you don't want.

Upvotes: 5

Related Questions