Python: Rotation des logs Apache

Voici un petit script en Python qui permet de faire la rotation des fichiers de log d'un serveur Apache.

# -*- coding: UTF-8 -*-

"""
    logrotate.py
    ============
   
    Permet la rotation des logs Apache
   
    :Example:
   
    >>> import logrotate
    >>> logrotate.main()
"""

import os, shutil
import datetime as dt

F = r'D:\wamp\logs'                     # Répertoire des logs Apache
LOG = r'D:\utilities\logrotate.log'     # Fichier de log pour les rotations
TXT = 'ROTATION 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 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(LOG, 'a') as FLOG:
        for f in os.listdir(F):
            if f.endswith('.log'):
                for i in range(NBARCHIVE - 1, -2, -1):
                    if i == -1: _f = os.path.join(F, f)
                    else: _f = os.path.join(F, f + '.' + str(i))
                    __f = os.path.join(F, f + '.' + str(i+1))
                    if os.path.exists(_f):
                        with open(_f, 'r') as f1:
                            with open(__f, 'w') as f2:
                                try: f2.write(f1.read())
                                except: pass
                                else:
                                    print('{DATETIME} {T} {FILE} --> {NEWFILE}'.format(
                                        DATETIME=now(), FILE=_f, NEWFILE=__f, T=TXT), file=FLOG)
                                    if i == -1:
                                        with open(_f, 'w') as f3:
                                            f3.write('')

if __name__ == '__main__':
    main()

Et pour l'exécuter (arès avoir adapté les variables F, LOG, NBARCHIVE):

$ python3 logrotate.py

Fonctionne sous Linux et Windows

Une tâche cron sous Linux ou une tâche planifiée sous Windows permet d'automatiser l'exécution du script toutes les semaines par exemple.

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.