[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Rutina en logrotate para Apache2



2011/1/16 Camaleón <noelamac@gmail.com>:
> El Sun, 16 Jan 2011 14:11:05 +0100, fernando sainz escribió:
>
>> El día 16 de enero de 2011 13:23, Camaleón escribió:
>>> El Sun, 16 Jan 2011 01:21:47 +0100, Javier Barroso escribió:
>
> (...)
>
>>>> Cuéntanos si consigues hacer exactamente lo que quieres sólo con
>>>> logrotate, yo creo que más bien me haría un cutre-script ... sobre
>>>> todo para comprimir todos los logs del año en un fichero .. quizás
>>>> como han comentado por aquí usando el postrotate (comprobar que no
>>>> exista un fichero comprimido de ese año y luego generarlo)
>>>
>>> Sí, eso es lo que estaba pensando, tal y como comentaba Fernando, que
>>> tendría que tirar de algún script que se encargara de esto, pero tengo
>>> que mirarlo con calma porque el "postrotate" se ejecuta tras cada
>>> rotación (en mi caso, cada mes) pero sólo debería ejecutar la
>>> compresión de los archivos tras 12 rotaciones (que sería 1 año) y no sé
>>> bien cómo obtener esa variable (hum, ¿podría usar un "if rotate > 12
>>> then gzip"?) O:-).
>>>
>>>> Saludos
>>>> [1] http://httpd.apache.org/docs/2.0/programs/rotatelogs.html
>>>
>>> Saludos y gracias a los dos por las sugerencias.
>>>
>>>
>> No se exactamente que quieres hacer, pero contar ficheros es fácil. ls
>> /dir | wc -l
>
> Je, pues sí, no se me había ocurrido. A ver qué os parece esta "cosa" que
> he preparado (ojo, que no está probado directamente con el logrotate, sólo
> he hecho una prueba "a capela", ejecutando el script directamente sobre un
> directorio con archivos pre-creados):
>
> ***
> # 20110116 archive old access logs on a per year basis
> if [ `ls access.*.log | wc -l` -gt 12 ]; then
>    tar -cf access.$(date '+%F').tar.gz access.$(date '+%Y' --date='1 year ago')*.log
>    # let's check how it works before deleting
>    # rm access.$(date '+%Y' --date='1 year ago')*.log
> fi
> ***

Te falta el z en el tar y seguramente ajustar el script para que te
pille los *log.gz ..., y luego el -f en el rm (es bueno que en los
servidores rm sea un alias a "rm -i")


>
> La idea es que el primero de enero de cada año, al ejecutarse la rutina del
> logrotate, el script detecte que ya hay 12 archivos access.*.log y genere el
> archivador con los registros del año pasado.
>
> A mí me parece un poco "cutrecillo" pero creo que funcionaría salvo que se
> me haya pasado algo por alto y no me dé cuenta hasta el año que viene O:-)
>
> Si se os ocurre alguna idea o mejora (por ejemplo, cómo añadir
> "elegantemente" en el mismo script los archivos "error.*.log", más allá de
> copiar/pegar el mismo bloque y cambiando el nombre :-P), avisad.
A mi se me ocurre mejor que comprimir si hay 12 ficheros, mirar a ver
si hay ficheros del año anterior y comprimirlos si los hay.

Mi propuesta con bash (puedes coger la idea del tipo para ajustar tu
función sin tener que copiar / pegar :) ):

function comprimir_logs
 {
 tipo="$1"
 anyo_anterior=$(date +'%Y' -d '1 year ago')
 ficheros=($(find /var/log/apache2 -name "$tipo.$anyo_anterior*.log*"))
 if [ ${#ficheros} -gt 0 ]
 then
     tar -zcf /var/log/apache2/$tipo.$(date +'%F').tar.gz ${ficheros[*]}
     if [ $? -eq 0 ]
     then
         rm -f ${ficheros[*]
     else
         echo "Algo ha ido mal" |
         mail -s "fallo al comprimir $tipo" xxx@yyy
     fi
 fi
 }

 comprimir_logs error
 comprimir_logs access


Saludos


Reply to: