1 votes

Mise en ordre des vieux logs d'apache gérés par vlogger

Nous utilisons vlogger pour gérer les logs d'apache, ce qui permet de garder tout en ordre, mais qui empêche d'utiliser logrotate, d'après ce que je peux voir. Par exemple, nos access.logs virtuels se trouvent chacun dans leur propre répertoire et sont nommés de la manière suivante :

/virtual.com/ 20100501-access.log 20100502-access.log 20100503-access.log 20100504-access.log

etc.

Quelqu'un a-t-il créé un script de nettoyage pour parcourir les sous-répertoires /var/log/httpd/ et supprimer les anciens logs ? Nous aimons utiliser vlogger, mais nettoyer les anciens journaux après lui est une douleur !

1voto

William Points 1158

Si vous travaillez sur une plate-forme Unix/Linux, vous pouvez le faire facilement avec la commande "find". Voir ici pour un bon tutoriel. Vous pouvez les compresser si nécessaire et ensuite rm les logs bruts en fonction de l'heure de dernière modification.

1voto

Kyle Brandt Points 81077

En fait, je ne recommanderais pas l'utilisation de l'heure modifiée, car quelque chose pourrait la perturber et vous perdriez vos enregistrements.

Une solution robuste que je pourrais utiliser consisterait à analyser la date de chaque fichier, à les convertir en objets de type datetime en Python ou en perl, puis à supprimer les journaux plus anciens que X.

Une solution plus ponctuelle pourrait être quelque chose comme ce qui suit dans le Shell pour supprimer les journaux du mois dernier (sans écho bien sûr) :

echo rm */20100$(($(date +%m) - 1 ))*-access.log

$(( )) est de l'arithmétique bash, et $( ) est une substitution de commande, comme vous pouvez le voir, ils peuvent être imbriqués.

0 votes

Bon point - la date du journal dans le nom du fichier en fait une meilleure solution.

0voto

oxullo Points 301

J'utilise actuellement le script Python suivant. Je ne me souviens pas vraiment pourquoi j'utilise le masque de date par défaut, qui est certainement maladroit. Ajustez le RE défini dans MASK, modifiez la var LOGDIR et définissez THRESHOLD comme le nombre de jours que vous souhaitez conserver.

#!/usr/bin/env python

# THIS SCRIPT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
# PURPOSE, OR NON-INFRINGEMENT.

import datetime
import os
import re

LOGDIR = '/srv/logs'
MASK = re.compile('(?P<month>\d{2})(?P<day>\d{2})(?P<year>\d{4})\-')
THRESHOLD = 10

topdirs = [d for d in os.listdir(LOGDIR)
        if os.path.isdir(os.path.join(LOGDIR, d)) and d[0] != '.']

removed = 0
errors = []
for d in topdirs:
    vhost = os.path.join(LOGDIR, d)

    for f in os.listdir(vhost):
        logfile = os.path.join(vhost, f)
        if os.path.isfile(logfile):
            m = re.match(MASK, f)
            if m:
                dt = datetime.date(int(m.group('year')), int(m.group('month')),
                        int(m.group('day')))
                delta = datetime.date.today() - dt

                if delta.days > THRESHOLD:
                    try:
                        os.unlink(logfile)
                    except OSError:
                        errors.append(logfile)
                    else:
                        removed += 1

print 'Pruned %d logfiles' % removed

if errors:
    print 'Errors:'
    print '\n'.join(errors)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X