ferramenta de rotação de log que mantém apenas uma quantidade especificada de logs e descarta tudo o mais

1

Estou procurando uma ferramenta parecida com um cronolog que mantenha apenas as últimas n linhas ou últimos x minutos de logs canalizados para ela e descarte tudo o mais

Existe tal fera?

ATUALIZAÇÃO:

Eu sei sobre logrotate e ele renomeia e fecha logfiles antigos, o que não é o que eu quero.

Eu quero descartar linhas de registro antigas e manter apenas linhas recentes.

Como, por exemplo, fazendo isso de vez em quando: tail -10000 logfile > logfile.new logfile.new logfile exceto que com esta técnica você certamente perderá linhas de log e você terá que reiniciar ou sinalizar o aplicativo de log para reabrir o arquivo de log.

    
por Aleksandar Ivanisevic 18.07.2009 / 17:46

5 respostas

4

Logrotate pode ser feito para manter apenas uma cópia de um arquivo de log ... Se você tiver RTFM, encontrará o seguinte bit sobre as configurações:

rotate count
    Log files are rotated count times before being removed or mailed to the 
    address specified in a mail directive. If count is  0,  old  versions  
    are  removed  rather than rotated.

Você pode acoplar girar com tamanho , novamente na página do manual logrotate (8) , para manter o tamanho do arquivo pequeno. Embora não pelo número de linhas, mas por k, M, tamanho G.

size size
    Log  files  are rotated when they grow bigger than size bytes. If size is 
    followed by M, the size if assumed to be in megabytes.  If the G suffix is 
    used, the size  is  in gigabytes.   If  the k is used, the size is in 
    kilobytes. So size 100, size 100k, and size 100M are all valid.
    
por 20.07.2009 / 14:43
2

Você pode usar logrotate e colocar

tail -10000 logfile.0 > logfile.0.new 
mv logfile.0.new > logfile.0

como parte do comando postrotate. logrotate permite que você especifique comandos postrotate.

    
por 18.07.2009 / 19:42
1

Você terá que reiniciar ou sinalizar o aplicativo de qualquer maneira. O aplicativo precisa, de alguma forma, conhecer o novo deslocamento para seek () ou ter que reabrir o filehandle ao aparar o arquivo de log.

    
por 18.07.2009 / 23:07
0

Não totalmente o que você está dizendo, mas você pode conferir logrotate(8) . Na página do manual:

logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files. Each log file may be handled ... when it grows too large.

Ele é instalado por padrão no RHEL e nos derivativos. Eu não sei sobre nada como o Ubuntu / derivativos ou o Windows.

    
por 18.07.2009 / 18:00
0

No final, resolvi assim (não é o mais elegante, mas funciona):

no apache (ou quem registra):

CustomLog "|/usr/local/cronolog/sbin/cronolog /var/tmp/mylog.%Y%m%d.log" logformat

no cron.daily:

find /var/tmp/ -name mylog* -mtime +$days | xargs --no-run-if-empty rm

isso excluirá os registros antigos

e finalmente no script de análise:

lastdate = $ (date -d "$ INTERVAL sec atrás" +% Y-% m-% dT% H:% M:% S)

grep -h $ SEARCH / var / tmp / mylog * | awk -v lastdate="$ lastdate" '$ 1 > lastdate {print}' > / tmp / cutlog

e, em seguida, trabalhe com / tmp / cutlog

o exemplo acima assume carimbos de data / hora ISO no primeiro campo como: 2009-07-20T13: 52: 32

não é a maneira mais elegante, mas faz o que eu quero. Talvez um dia eu escreva um recurso para o cronolog que faça a mesma coisa:)

    
por 20.07.2009 / 13:58