Blame view

logrotate.py 7.01 KB
edd879ef1   ronan   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
  # -*- 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()
30518bfa9   ronan   gestion des erreurs
33
34
35
36
37
38
39
40
41
42
43
44
      
  def cleanList(LIST = [], LISTERR = []):
      """
          Supprime de la liste ``LIST`` tous les fichiers 
          correspondant à ceux en erreur présent dans la liste ``LISTERR``
          
          :return: Une nouvelle liste de fichiers nettoyées
          :rtype:  list
      """
      for ERR in LISTERR:
          LIST = list(filter(lambda f: not f.startswith(ERR), LIST))
      return LIST
edd879ef1   ronan   added new file
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
  
  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))
30518bfa9   ronan   gestion des erreurs
85
  def incrementZipFile(LIST, FLOG, LISTERR = []):
edd879ef1   ronan   added new file
86
87
      """
          Incrémente les archives ZIP jusqu'à ``NBARCHIVE``
30518bfa9   ronan   gestion des erreurs
88
89
90
          
          :return: Une liste de fichiers en erreur
          :rtype:  list
edd879ef1   ronan   added new file
91
92
93
94
95
      """
      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)
30518bfa9   ronan   gestion des erreurs
96
          ERR = False
edd879ef1   ronan   added new file
97
98
99
          for FILE in WLIST:
              TF = FILE.split('.')
              IDX = int(TF[2])
68274206e   ronan   modification incr...
100
101
              if IDX < NBARCHIVE:
                  OLDFILE = os.path.join(F, FILE)
edd879ef1   ronan   added new file
102
103
                  TF[2] = str(IDX + 1)
                  NEWFILE = os.path.join(F, '.'.join(TF))
68274206e   ronan   modification incr...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
                  try:
                      with zipfile.ZipFile(OLDFILE, mode='r', compression=zipfile.ZIP_DEFLATED) as f1:
                          try:
                              CT = f1.read(os.path.splitext(FILE)[0])
                          except: ERR = True
                          else:
                              BASE = os.path.splitext(os.path.basename(NEWFILE))[0]
                              try:
                                  with zipfile.ZipFile(NEWFILE, mode='w', compression=zipfile.ZIP_DEFLATED) as f2:
                                      f2.writestr(BASE, CT)
                              except: ERR = True
                              else: log(FLOG, TXT, OLDFILE, '{NEWFILE}'.format(NEWFILE=NEWFILE))
                  except: ERR = True
                  finally:
                      if ERR:
                          LISTERR.append(f)
                          log(FLOG, TXT, OLDFILE, '{NEWFILE} ***KO***'.format(NEWFILE=NEWFILE))
                          break
30518bfa9   ronan   gestion des erreurs
122
      return LISTERR
edd879ef1   ronan   added new file
123

30518bfa9   ronan   gestion des erreurs
124
  def log_0ToZip(LIST, FLOG, LISTERR = []):
edd879ef1   ronan   added new file
125
126
127
128
      """
          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
30518bfa9   ronan   gestion des erreurs
129
130
131
          
          :return: Une liste de fichiers en erreur
          :rtype:  list
edd879ef1   ronan   added new file
132
133
134
      """
      LISTLOG0 = listLog(LIST, '.log.0')
      for FILE in LISTLOG0:
30518bfa9   ronan   gestion des erreurs
135
          ERR = False
edd879ef1   ronan   added new file
136
          with open(os.path.join(F, FILE), mode='r', encoding='UTF-8') as f1:
30518bfa9   ronan   gestion des erreurs
137
              BASE = FILE[:-1] + '1'
edd879ef1   ronan   added new file
138
139
140
              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'))
30518bfa9   ronan   gestion des erreurs
141
142
143
144
                  except: 
                      ERR = True
                      LISTERR.append(FILE[:-2])
                      log(FLOG, TXT3, os.path.join(F, FILE), '{NEWFILE} ***KO***'.format(NEWFILE=ZIP))
edd879ef1   ronan   added new file
145
                  else: log(FLOG, TXT3, os.path.join(F, FILE), '{NEWFILE}'.format(NEWFILE=ZIP))
30518bfa9   ronan   gestion des erreurs
146
147
          if not ERR: delFile(os.path.join(F, FILE), FLOG)
      return LISTERR
edd879ef1   ronan   added new file
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  
  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))
30518bfa9   ronan   gestion des erreurs
164
165
166
167
168
169
170
          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')
edd879ef1   ronan   added new file
171
172
173
174
175
176
177
178
179
180
181
182
  
  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
30518bfa9   ronan   gestion des erreurs
183
184
185
186
          LISTERR = incrementZipFile(LIST, FLOG)
          LIST = cleanList(LIST, LISTERR)
          LISTERR = log_0ToZip(LIST, FLOG, LISTERR)
          LIST = cleanList(LIST, LISTERR)
edd879ef1   ronan   added new file
187
188
189
190
          logTo0(LIST, FLOG)
  
  if __name__ == '__main__':
      main()