From edd879ef1eca845a7230d05326cdd195be439cd4 Mon Sep 17 00:00:00 2001 From: ronan Date: Wed, 19 Sep 2018 10:21:58 +0200 Subject: [PATCH] added new file --- logrotate.py | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 logrotate.py diff --git a/logrotate.py b/logrotate.py new file mode 100644 index 0000000..9e044a9 --- /dev/null +++ b/logrotate.py @@ -0,0 +1,152 @@ +# -*- coding: UTF-8 -*- + +""" + logrotate.py + ============ + + Permet la rotation des logs Apache + + :Example: + + >>> import logrotate + >>> logrotate.main() +""" + +import os, shutil, zipfile +import datetime as dt + +F = r'C:\wamp\logs' # Répertoire des logs Apache +LOG = 'logrotate.log' # Fichier de log pour les rotations +TXT = 'ROTATION DU FICHIER' # Texte affiché dans le log des rotations +TXT2 = 'SUPPRESSION DU FICHIER' # Texte affiché dans le log des rotations +TXT3 = 'COMPRESSION DU FICHIER' # Texte affiché dans le log des rotations +NBARCHIVE = 20 # Nombre de fichier de log historisé .0 .1 .2 etc etc ... + +def now(): + """ + Retourne la date et l'heure courante au format ISO 2018-06-28T10:30:23.816122 + + :return: La date et heure courante + :rtype: datetime.datetime + """ + return dt.datetime.now().isoformat() + +def log(FLOG, TXT, FILE, MSG): + """ + Ecrit dans le fichier ``FLOG`` les infos + ``TXT``, ``FILE`` et ``MSG`` avec la date courante + """ + print('{DATETIME} {T:<25s} {FILE:<40s} --> {MSG}'.format(DATETIME=now(), FILE=FILE, T=TXT, MSG=MSG), file=FLOG) + +def delFile(FILE, FLOG): + """ + Supprime le fichier ``FILE`` + """ + try: os.remove(FILE) + except: log(FLOG, TXT2, FILE, 'KO') + else: log(FLOG, TXT2, FILE, 'OK') + +def listLog(LIST, EXT): + """ + Extrait tous les fichiers de log avec l'extension ``EXT`` + de la liste ``LIST`` + + :return: Une liste contenant uniquement les fichiers ayant l'extension ``EXT`` + :rtype: list + """ + return list(filter(lambda f: f.endswith(EXT), LIST)) + +def removeUnusedFiles(FLOG): + """ + Supprime tous les fichiers qui ne sont plus concernés par des fichiers LOG + Retourne une nouvelle liste avec les fichiers supprimés en moins + + :return: Une nouvelle liste avec les fichiers supprimés en moins + :rtype: list + """ + LIST = os.listdir(F) + LISTLOG = listLog(LIST, '.log') + LISTDEL = list(filter(lambda x: '.'.join(x.split('.')[:2]) not in LISTLOG, LIST)) + for FILE in LISTDEL: + delFile(os.path.join(F, FILE), FLOG) + return list(set(LIST) - set(LISTDEL)) + +def incrementZipFile(LIST, FLOG): + """ + Incrémente les archives ZIP jusqu'à ``NBARCHIVE`` + Suppression de l'archive ZIP dont son index est supérieur + ou égal à ``NBARCHIVE`` + """ + LISTLOG = listLog(LIST, '.log') + LISTZIP = listLog(LIST, '.zip') + for f in LISTLOG: + WLIST = sorted(list(filter(lambda x: x.startswith(f), LISTZIP)), key=lambda y: int(y.split('.')[2]), reverse=True) + for FILE in WLIST: + TF = FILE.split('.') + IDX = int(TF[2]) + OLDFILE = os.path.join(F, FILE) + if IDX >= NBARCHIVE: + delFile(OLDFILE, FLOG) + else: + TF[2] = str(IDX + 1) + NEWFILE = os.path.join(F, '.'.join(TF)) + try: os.rename(OLDFILE, NEWFILE) + except: log(FLOG, TXT, OLDFILE, '{NEWFILE} ***KO***'.format(NEWFILE=NEWFILE)) + else: log(FLOG, TXT, OLDFILE, '{NEWFILE}'.format(NEWFILE=NEWFILE)) + +def log_0ToZip(LIST, FLOG): + """ + On écrit tout le contenu des fichiers LOG *.log.0 + dans de nouveaux fichiers ZIP *.log.1.zip + On supprime ensuite tous les fichiers *.log.0 + """ + LISTLOG0 = listLog(LIST, '.log.0') + for FILE in LISTLOG0: + with open(os.path.join(F, FILE), mode='r', encoding='UTF-8') as f1: + BASE = '.'.join(FILE.split('.')[:-1]) + '.1' + ZIP = os.path.join(F, BASE + '.zip') + with zipfile.ZipFile(ZIP, 'w', compression=zipfile.ZIP_DEFLATED) as f2: + try: f2.writestr(BASE, f1.read().encode('UTF-8')) + except: log(FLOG, TXT3, os.path.join(F, FILE), '{NEWFILE} ***KO***'.format(NEWFILE=ZIP)) + else: log(FLOG, TXT3, os.path.join(F, FILE), '{NEWFILE}'.format(NEWFILE=ZIP)) + delFile(os.path.join(F, FILE), FLOG) + +def logTo0(LIST, FLOG): + """ + On écrit tout le contenu des fichiers LOG *.log + dans de nouveaux fichiers numérotés *.log.0 + On écrase ensuite le contenu des fichiers LOG + """ + LISTLOG = listLog(LIST, '.log') + for FILE in LISTLOG: + OLDFILE = os.path.join(F, FILE) + NEWFILE = os.path.join(F, FILE + '.0') + try: + with open(OLDFILE, mode='r', encoding='UTF-8') as f1: + with open(NEWFILE, mode='w', encoding='UTF-8') as f2: + f2.write(f1.read()) + except: log(FLOG, TXT, OLDFILE, '{NEWFILE} ***KO***'.format(NEWFILE=NEWFILE)) + else: log(FLOG, TXT, OLDFILE, '{NEWFILE}'.format(NEWFILE=NEWFILE)) + try: + with open(OLDFILE, mode='w', encoding='UTF-8') as f1: + f1.write('') + except: log(FLOG, TXT2, OLDFILE, 'KO') + else: log(FLOG, TXT2, OLDFILE, 'OK') + +def main(): + """ + Fonction principale + + Pour chaque fichier de log (*.log) trouvé dans le dossier (variable ``F``) + Chaque niveau d'archive est incrémenté de 1 dans la limite du nombre d'archive + indiqué dans la variable ``NBARCHIVE`` + """ + with open(os.path.join(F, LOG), mode='a', encoding='UTF-8') as FLOG: + LIST = removeUnusedFiles(FLOG) + LIST.remove(LOG) # On supprime de la liste le fichier de LOG du script + incrementZipFile(LIST, FLOG) + log_0ToZip(LIST, FLOG) + logTo0(LIST, FLOG) + +if __name__ == '__main__': + main() -- 1.7.9.5