Arrumando antigos logs de apache gerenciados pelo vlogger

1

Estamos usando o vlogger para gerenciar nossos logs do apache, o que mantém tudo legal e organizado, mas praticamente impossibilita o uso do logrotate, tanto quanto eu posso ver. por exemplo. nossos access.logs virtuais ficam dentro de seu próprio diretório e são nomeados de forma semelhante a:

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

etc.

Alguém criou um script de limpeza para percorrer os diretórios / var / log / httpd / sub e remover logs antigos? Nós gostamos de usar o vlogger, mas limpar os logs antigos depois é uma dor!

    
por Andre Lackmann 26.05.2010 / 01:28

3 respostas

1

Se você estiver executando em uma plataforma Unix / Linux, poderá fazê-lo facilmente com o comando 'find'. Veja aqui para um bom tutorial. Você poderia gzip-los, se necessário e, em seguida, rm os logs brutos com base na hora da última modificação.

    
por 26.05.2010 / 01:40
1

Na verdade, eu não recomendaria usar o tempo modificado porque algo poderia atrapalhar isso e você perderia os registros.

Uma boa solução robusta que eu possa usar é analisar a data de cada arquivo, convertê-los em objetos datetime em python ou perl e, em seguida, excluir logs anteriores a X.

Uma solução mais isolada pode ser algo como o seguinte no shell para excluir logs do mês passado (sem eco, é claro):

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

$(( )) é bash arithmetic, e $( ) é substituição de comando, como você pode ver, eles podem ser aninhados.

    
por 26.05.2010 / 02:49
0

Atualmente estou usando o seguinte script python. Eu não lembro porque estou usando a máscara de data padrão, o que é definitivamente estranho. Ajuste o RE definido no MASK, altere o LOGDIR var e configure THRESHOLD como o número de dias que você deseja manter.

#!/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)
    
por 10.06.2010 / 01:16

Tags