113 lines
3.2 KiB
Python
113 lines
3.2 KiB
Python
#!/usr/bin/env python
|
|
|
|
''' A python logrotate library'''
|
|
|
|
import os
|
|
import glob
|
|
|
|
__author__ = 'Kyle Laplante'
|
|
__copyright__ = 'Copyright 2013, Kyle Laplante'
|
|
__date__ = '07-07-2013'
|
|
|
|
__license__ = 'GPL'
|
|
__version__ = '1.3'
|
|
__email__ = 'kyle.laplante@gmail.com'
|
|
|
|
|
|
class LogRotateException(Exception):
|
|
pass
|
|
|
|
|
|
class LogRotate:
|
|
|
|
"""This library is a simple logrotater (or file rotater).
|
|
Simply pass in the path to the main logfile and this
|
|
library will rotate all the logs by an increment of 1.
|
|
Example:
|
|
|
|
import logrotater
|
|
|
|
rotater = logrotater.LogRotate(prefix='/home/kyle/p4.log', verbose=True)
|
|
|
|
rotater.rotate()
|
|
|
|
The prefix path should be the path of the main logfile without the .N extension.
|
|
The previous example would rotate /home/kyle/p4.log.N to /home/kyle/p4.log.N+1,
|
|
move /home/kyle/p4.log to /home/kyle/p4.log.1 and create a new empty /home/kyle/p4.log."""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
'''Required kwargs: prefix="some path"
|
|
Optional kwargs: verbose=True
|
|
If verbose is True then LogRotate will print what it is doing with each file.'''
|
|
|
|
self.verbose = kwargs.get('verbose', False)
|
|
for k, v in kwargs.items():
|
|
setattr(self, k, v)
|
|
if not os.path.isfile(self.prefix):
|
|
raise LogRotateException("Must use a valid prefix filename")
|
|
|
|
def rotate(self, *args, **kwargs):
|
|
self.files = glob.glob(self.prefix + "*")
|
|
if not len(self.files) > 0:
|
|
raise LogRotateException(
|
|
"No files with the prefix %s found" % self.prefix)
|
|
self.nums = []
|
|
for file in self.files:
|
|
try:
|
|
self.nums.append(int(file.split(self.prefix + '.')[-1]))
|
|
except ValueError:
|
|
pass
|
|
self.nums.sort()
|
|
self.nums.reverse()
|
|
for num in self.nums:
|
|
new_num = num + 1
|
|
if self.verbose:
|
|
print("moving %s.%d to %s.%d" % (self.prefix, num, self.prefix, new_num))
|
|
os.rename("%s.%d" % (self.prefix, num), "%s.%d" %
|
|
(self.prefix, new_num))
|
|
if self.verbose:
|
|
print("moving %s to %s.1" % (self.prefix, self.prefix))
|
|
os.rename(self.prefix, self.prefix + '.1')
|
|
self.touch(self.prefix)
|
|
|
|
def touch(self, path):
|
|
|
|
'''a simple method to touch a file'''
|
|
|
|
if self.verbose:
|
|
print("Creating file: %s" % path)
|
|
f = open(path, 'a')
|
|
os.utime(path, None)
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from optparse import OptionParser
|
|
import sys
|
|
|
|
usage = '''%prog [options] <file prefix>
|
|
|
|
File prefix is the path to the main logfile.'''
|
|
|
|
parser = OptionParser(usage=usage)
|
|
parser.add_option(
|
|
'-p', '--prefix', dest='prefix', default=None, help='Filename prefix.')
|
|
parser.add_option('-v', '--verbose', dest='verbose',
|
|
action='store_true', default=False, help='Enable verbose output')
|
|
(opts, args) = parser.parse_args()
|
|
|
|
if opts.prefix is None:
|
|
print("Please enter a filename prefix")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
rotater = LogRotate(prefix=opts.prefix, verbose=opts.verbose)
|
|
except LogRotateException as e:
|
|
print(e)
|
|
sys.exit(1)
|
|
try:
|
|
rotater.rotate()
|
|
except LogRotateException as e:
|
|
print(e)
|
|
sys.exit(1)
|