rotate logs log tomcat date redhat logrotate

tomcat - logs - Logrotate archivos con fecha en el nombre del archivo.



log rotate catalina out (10)

Estoy intentando configurar logrotate en RHEL para los registros de tomcat6. Actualmente, logrotate funciona bien para el registro de catalina.out, se gira y se comprime correctamente.

El problema es con los archivos con fecha en ellos como:

catalina.2012-01-20.log catalina.2012-01-21.log catalina.2012-01-22.log

Estos archivos no están siendo rotados. Entiendo que tengo que configurar estos en el archivo /etc/logrotate.d/tomcat6 donde se configura la rotación para catalina.out. Pero no puedo configurarlo.

Todo lo que quiero es que estos archivos antiguos se compriman a diario, excepto el archivo de registro de la fecha actual.

¿Alguien puede ayudarme en esto, por favor?

Gracias Noman A.


(Primer post de la historia, así que si parece que una araña borracha lo ha formateado, lo siento)

Después de usar a nuestro amigo Google, aquí y no recuerdo dónde más logré lograr algo usando logrotate (en lugar de cron o algún otro equivalente).

Tengo lo siguiente en / var / log / rsync /:

-rw-r--r-- 1 root root 1.1M Apr 9 08:13 2014-04-09 07:48:18.log -rw-r--r-- 1 root root 1.4M Apr 11 15:20 2014-04-11 15:02:52.log -rw-r--r-- 1 root root 1.6M Apr 11 15:42 2014-04-11 15:22:04.log -rw-r--r-- 1 root root 1.8M Apr 12 08:01 2014-04-12 07:45:31.log -rw-r--r-- 1 root root 2.0M Apr 13 08:10 2014-04-13 07:53:38.log -rw-r--r-- 1 root root 2.2M Apr 14 08:19 2014-04-14 07:51:09.log -rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log -rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log

y el siguiente archivo logrotate:

/var/log/rsync/*.log { daily rotate 7 compress delaycompress notifempty missingok }

que pensé que era perfectamente razonable. Pero después de que se negó a trabajar y al descubrir que nunca funcionaría (cortesía de este post), me pregunté si podría evitarse para que funcione.

Después de muchas pruebas y ajustes, logré manipularlo de la siguiente manera:

/var/log/rsync/dummy { daily rotate 0 create ifempty lastaction /usr/bin/find /var/log/rsync/ -mtime +7 -delete /usr/bin/find /var/log/rsync/ -mtime +1 -exec gzip -q {} /; endscript }

en un archivo de configuración logrotate llamado /etc/logrotate.d/local-rsync. Luego crea el archivo de registro ficticio:

touch /var/log/rsync/dummy

luego forzar un logrotate con:

logrotate -fv /etc/logrotate.d/local-rsync

lo que da:

-rw-r--r-- 1 root root 71K Apr 9 08:13 2014-04-09 07:48:18.log.gz -rw-r--r-- 1 root root 88K Apr 11 15:20 2014-04-11 15:02:52.log.gz -rw-r--r-- 1 root root 82K Apr 11 15:42 2014-04-11 15:22:04.log.gz -rw-r--r-- 1 root root 84K Apr 12 08:01 2014-04-12 07:45:31.log.gz -rw-r--r-- 1 root root 87K Apr 13 08:10 2014-04-13 07:53:38.log.gz -rw-r--r-- 1 root root 92K Apr 14 08:19 2014-04-14 07:51:09.log.gz -rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log -rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log -rw-r--r-- 1 root root 0 Apr 16 12:11 dummy

Ahora solo espera mañana por la mañana ...

Me doy cuenta de que cron estaría más ordenado, pero tengo otro elemento en el archivo de configuración logrotate y quise mantener los dos juntos.

¡La ventaja con el archivo ficticio es que no ocupa espacio!

Usted puede encontrar que no parece haber girado nada un día. Me tomó un tiempo para averiguar por qué, pero luego se retorció. find -mtime +1 son días completos (es decir, 24 * 60 minutos) y si el logrotate diario se inició en menos de 24 horas desde la última vez que se crearon los registros, a veces parece que no funcionó. Si te molesta, usar 23 horas con find -mmin +1380 puede ser más apropiado.


/path/to/logs/*.log {missingok compress rotate 7}

este tipo de cosas no funciona normalmente porque, como otros señalan, Tomcat tiene su propia rotación de registros. Puede usar un cron simple para eliminar archivos antiguos o desactivar la rotación en la válvula de registro de acceso. Al desactivar la rotación de registros (y la posible modificación del patrón de nombre de archivo), el logrotate anterior y otras configuraciones similares funcionarán bien.

La conclusión es que debe usar logrotate o la rotación de registro integrada en Tomcat pero no ambas al mismo tiempo.


Además, puedes agregar crons en lugar de hardcode logrotate.

1 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +30 -delete 2 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +1 -exec gzip -q {} /;

De esta manera, eliminará los registros con más de 30 días y los comprimirá con más de 1.


Algo como esto en /etc/cron.d/rotate_tomcat_logs:

# delete every log file over 100 days old, and compress every log file over 1 day old. 00 1 * * * root ( find /opt/tomcat/logs -name /*log/* -name /*.gz -mtime +100 -exec rm -f {} /; >/dev/null 2>&1 ) 05 1 * * * root ( find /opt/tomcat/logs -name /*log/* ! -name /*.gz -mtime +1 -exec gzip {} /; >/dev/null 2>&1 )


Bueno, no estaba completamente satisfecho con ninguna de las respuestas, aunque las situaciones que indican que logrotate no es compatible con este escenario (es decir, solo para eliminar archivos rotados por alguna otra aplicación ) son seguramente correctas (plantear una solicitud de función en esa herramienta). , ¿tal vez?).

Por lo tanto, me gustaría compartir un enfoque alternativo al que he llegado. A diferencia de la solución " find /path/to/logs -mtime +7 -delete ", esta no eliminará todos los registros antiguos después de un período de tiempo específico . Así que aquí viene, un ejemplo de comando bash de una línea que deja solo N últimos registros en el disco ( siempre que se ejecuta ):

for f in `ls -1r | grep -E "^catalina/.[0-9]{4}-[0-9]{2}-[0-9]{2}/.log$" | tail -n +$((N+1))`; do rm $f; done

Finalmente, para cubrir el tema por completo, la última solución alternativa no es rotar los archivos de registro (por ejemplo, usar rotatable=false en el caso de Tomcat - ver sus documentos) y usar el logrotate como siempre, pero no olvide usarlo con ''copytruncate'' opción ''copytruncate'' .

Las sugerencias son bienvenidas ...


En el archivo de rotación de registros, use rotate # , donde # es el número de registros que desea conservar antes de eliminarlos.

recuento de rotación

Los archivos de registro se giran varias veces antes de ser eliminados o enviados por correo a la dirección especificada en una directiva de correo. Si el conteo es 0, las versiones anteriores se eliminan en lugar de rotar.


Para habilitar la rotación diaria de registros en tomcat [linux] con postfix of date a catalina file, realice los cambios siguientes

Descarga el paquete cronolog e instala en linux os

wget http://pkgs.fedoraproject.org/repo/pkgs/cronolog/cronolog-1.6.2.tar.gz/md5/a44564fd5a5b061a5691b9a837d04979/cronolog-1.6.2.tar.gz

tar -zxvf cronolog-1.6.2.tar.gz ./configure make make install

abra el archivo apache-tomcat-7.0.65 / bin / catalina.sh usando el comando vi y cambie las líneas como se muestra a continuación: ejemplo: /opt/apache-tomcat-7.0.65/bin/catalina.sh

shift touch "$CATALINA_OUT" # comment above line as below #touch "$CATALINA_OUT" if [ "$1" = "-security" ] ; then if [ $have_tty -eq 1 ]; then echo "Using Security Manager" fi shift eval "/"$_RUNJAVA/"" "/"$LOGGING_CONFIG/"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS / -Djava.endorsed.dirs="/"$JAVA_ENDORSED_DIRS/"" -classpath "/"$CLASSPATH/"" / -Djava.security.manager / -Djava.security.policy=="/"$CATALINA_BASE/conf/catalina.policy/"" / -Dcatalina.base="/"$CATALINA_BASE/"" / -Dcatalina.home="/"$CATALINA_HOME/"" / -Djava.io.tmpdir="/"$CATALINA_TMPDIR/"" / org.apache.catalina.startup.Bootstrap "$@" start / #>> "$CATALINA_OUT" 2>&1 "&" # comment above line and add below given line 2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" & else eval "/"$_RUNJAVA/"" "/"$LOGGING_CONFIG/"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS / -Djava.endorsed.dirs="/"$JAVA_ENDORSED_DIRS/"" -classpath "/"$CLASSPATH/"" / -Dcatalina.base="/"$CATALINA_BASE/"" / -Dcatalina.home="/"$CATALINA_HOME/"" / -Djava.io.tmpdir="/"$CATALINA_TMPDIR/"" / org.apache.catalina.startup.Bootstrap "$@" start / #>> "$CATALINA_OUT" 2>&1 "&" # comment above line and add below given line 2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" & fi

Después de los cambios anteriores, guarde el archivo y reinicie el tomcat para aplicar los cambios.


Para incluir una fecha en el archivo rotado, probablemente pueda usar la opción ''dateext''.

$ cat logrotate.conf /var/nginx/logs/access.log { size 10k copytruncate dateext rotate 10 compress }

El archivo girado debe ser creado similar a la siguiente

root@nitpc:~# ls -lrt /var/nginx/logs/access.* -rw-r--r-- 1 nginx root 5422 May 31 08:26 access.log -rw-r--r-- 1 nginx root 466 May 31 08:26 access.log-20180531.gz

El único inconveniente es que no podrá ejecutarlo más de una vez por día ya que el archivo tendrá un nombre definido para esa fecha.

El ejemplo anterior es de mi contenedor Dock Nginx que se ejecuta en k8s en GC. La versión logrotate es 3.11.0.

¡Espero que ayude!

Actualización: De las páginas man https://linux.die.net/man/8/logrotate

cadena de formato de formato de fecha

Especifique la extensión para dateext usando la notación similar a la función strftime (3). Solo se permiten los especificadores% Y% m% d y% s. El valor predeterminado es -% Y% m% d. Tenga en cuenta que también el carácter que separa el nombre de registro de la extensión es parte de la cadena de formato de fecha. El reloj del sistema debe configurarse después del 9 de septiembre de 2001 para que% s funcione correctamente. Tenga en cuenta que las marcas de datos generadas por este formato deben ser léxicamente clasificables (es decir, primero el año, luego el mes y luego el día, por ejemplo, 2001/12/01 está bien, pero el 01/12/2001 no, desde el 01/11 / 2002 se ordenaría más bajo mientras que es más tarde). Esto se debe a que al usar la opción de rotación, logrotate ordena todos los nombres de archivos girados para averiguar qué archivos de registro son más antiguos y deben eliminarse.


Pasé bastante tiempo leyendo mucha documentación. Logrotate no parece poder agrupar los diferentes archivos con fechas incluidas en el nombre del archivo. Logrotate no puede hacer lo que necesitamos que haga.

Tiene dos opciones para cambiar la función de registro proporcionada por java / tomcat para no incluir la fecha en el nombre del archivo. http://tomcat.apache.org/tomcat-6.0-doc/logging.html

La segunda y más rápida es usar su propio pequeño script para hacer el trabajo por usted, usando find . https://serverfault.com/questions/256218/logrotation-when-filenames-includes-date , https://serverfault.com/a/256231/71120

find / pathtologs / * -mtime +5 -exec rm {} /;

Fui con la segunda opción, porque nuestros desarrolladores han codificado las fechas en los nombres de los archivos. Así que tiene que seguir siendo así. Los conjuntos -mtime +5 encuentran que solo buscan archivos que tienen más de 5 días.

De la documentación de find .

Los datos del archivo se modificaron por última vez hace 24 horas. Vea los comentarios de -atime para comprender cómo el redondeo afecta la interpretación de los tiempos de modificación de archivos.

Actualizado según comentario

buscar / pathtologs / * -mtime +5 -delete

Si desea eliminar específicamente, esta es una forma rápida de hacerlo. Si necesita algún otro comando, siempre puede reemplazar el exec rm {} /; con algo mas