Blame view
logrotate.py
5.57 KB
edd879ef1 added new file |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 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() |