linux - forzar - logrotate ubuntu
Logrotate para limpiar los archivos con fecha estampada (6)
¡Puedes usar el comando de find
para hacer esa tarea fácilmente! Se eliminarán todos los archivos de 7 Days
edad. Póngalo en crontab
y corra todas las noches:
$ cd /data/tier2/scripts/logs/
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete
O mejor manera
$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;
Actualmente estoy tratando de encontrar un método para ordenar los archivos de registro de Oracle Recover creados por Cron ...
Actualmente, Cron invoca nuestro proceso de recuperación en espera de Oracle cada 15 minutos mediante el siguiente comando:
0,15,30,45 * * * * /data/tier2/scripts/recover_standby.sh SID >> /data/tier2/scripts/logs/recover_standby_SID_`date +/%d/%m/%y`.log 2>&1
Esto crea archivos que se parecen a:
$ ls -l /data/tier2/scripts/logs/
total 0
-rw-r--r-- 1 oracle oinstall 0 Feb 1 23:45 recover_standby_SID_010213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 2 23:45 recover_standby_SID_020213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 3 23:45 recover_standby_SID_030213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 4 23:45 recover_standby_SID_040213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 5 23:45 recover_standby_SID_050213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 6 23:45 recover_standby_SID_060213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 7 23:45 recover_standby_SID_070213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 8 23:45 recover_standby_SID_080213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 9 23:45 recover_standby_SID_090213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 10 23:45 recover_standby_SID_100213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 11 23:45 recover_standby_SID_110213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 12 23:45 recover_standby_SID_120213.log
Básicamente, quiero eliminar los archivos con más de x días de antigüedad, lo cual pensé que logrotate sería perfecto para ...
He configurado logrotate con el siguiente archivo de configuración:
/data/tier2/scripts/logs/recover_standby_*.log {
daily
dateext
dateformat %d%m%Y
maxage 7
missingok
}
¿Hay algo que me falta para obtener el resultado deseado?
Supongo que podría eliminar la fecha del archivo de registro de Crontab y luego hacer que logrotate gire ese archivo; sin embargo, la fecha en el archivo de registro no reflejará el día en que se generaron los registros ... es decir, las recuperaciones en 010313 se archivarán con fecha de 020313 debido a logrotate disparando en 020313 y girando el archivo ...
¿Alguna otra idea? Y gracias de antemano por cualquier respuesta.
Saludos
Gavin
(Actualizado) Sus opciones son:
- Como respondió Satish, abandone logrotate y ponga un script de búsqueda en cron
- Incluso podrías usar logrotate y poner un script de búsqueda en el comando postrote
Inicialmente, pensé que el cambio del formato de fecha para que coincidiera con sus registros podría funcionar, pero como Reid Nabinger señaló que el formato de fecha no era compatible con logrotate de todos modos. Recientemente, intenté configurar lo mismo, pero para los registros girados de Java que quería que logrotate eliminara. Probé la configuración a continuación, pero seguí intentando eliminar todos los registros.
/opt/jboss/log/server.log.* {
missingok
rotate 0
daily
maxage 30
}
Terminé simplemente implementando lo que Satish sugirió: un simple hallazgo con rm script en cron.
De acuerdo con @Jan Vlcinsky, puede dejar que logrotate agregue la fecha; simplemente use dateyesterday
para obtener la fecha correcta.
O bien, si desea ingresar la fecha usted mismo, puede "apuntar" al nombre sin la fecha, y luego se limpiarán los nombres con la fecha.
Sin embargo, lo que encontré es que si no tengo un archivo de registro allí, logrotate no hace la limpieza de los archivos con fechas.
Pero si está preparado para tener un archivo de registro vacío por ahí, puede hacerlo funcionar.
Por ejemplo, para limpiar / var / log / mylogfile. yyyymmdd .log después de 7 días, touch /var/log/mylogfile.log
, luego configure logrotate de la siguiente manera:
/var/log/mylogfile.log { daily rotate 7 maxage 7 dateext dateformat .%Y%m%d extension .log ifempty create }
Esta entrada, combinada con la existencia de mylogfile.log, activa logrotate para limpiar archivos antiguos, como si hubieran sido creados por logrotate.
daily
, maxage
plus maxage
hace que los archivos de registro antiguos se eliminen después de 7 días (o 7 archivos de registro antiguos, lo que ocurra primero).
dateext
, dateformat
plus extension
hace que logrotate coincida con nuestros nombres de archivos.
Y ifempty
más aún, asegúrese de que haya un archivo vacío allí o que la rotación del registro se detenga.
Otro consejo para la prueba, prepárese para editar /var/lib/logrotate.status para restablecer la fecha de ''última rotación'' o logrotate no hará nada por usted.
Logrotate elimina los archivos según el orden en la lista ordenada por léxico de los nombres de los archivos de registro rotados, y también por la antigüedad del archivo (utilizando la hora de la última modificación del archivo)
rotar es el número máximo de archivos rotados, puede encontrar. Si hay un número mayor de archivos de registro rotados, sus nombres se ordenan de forma léxica y se eliminan los más pequeños.
maxage define otro criterio para eliminar archivos de registro girados. Se elimina cualquier archivo de registro girado, que sea anterior al número de días dado. Tenga en cuenta que la fecha se detecta desde la última hora de modificación del archivo, no desde el nombre del archivo.
dateformat permite un formato específico para la fecha en archivos rotados. Las notas de la página de manual, que el formato dará como resultado una clasificación léxicamente correcta .
dateyesterday permite usar fechas en nombres de archivos de registro un día atrás.
Para mantener un número determinado de días en los archivos rotados diarios (por ejemplo, 7), debe configurar la rotate
en un valor de 7 y puede ignorar el maxage
, si sus archivos se crean y rotan realmente todos los días.
Si la creación del registro no se realiza durante un par de días, y durante 14 días, la cantidad de archivos de registro girados seguirá siendo la misma (7).
maxage
mejorará la situación en escenarios de "registros no producidos" al eliminar siempre archivos demasiado viejos. Después de 7 días sin producción de registros, no habrá archivos de registro girados.
No puede usar dateformat
como muestra OP, ya que no se puede clasificar léxicamente. El desorden con dateformat
probablemente resultaría en la eliminación de otros archivos de registro rotados de los que realmente deseaba.
Consejo : Ejecute logrotate desde la línea de comando con la opción -d
para realizar una ejecución en seco: verá lo que logrotate haría pero en realidad no hace nada. Luego realice una ejecución manual usando -v
(verbose) para que pueda confirmar que lo que está haciendo es lo que desea.
Solución: limpiar los registros creados por cron
El concepto es:
Deje que cron cree y actualice los archivos de registro, pero haga una pequeña modificación para crear archivos, siguiendo los nombres de archivo estándar de logrotate cuando use la fecha predeterminada por defecto
/data/tier2/scripts/logs/recover_standby_SID.log-`date +/%Y/%m/%d`.log
Use logrotate solo para eliminar archivos de registro demasiado viejos
- apuntar a un archivo de registro no existente
/data/tier2/scripts/logs/recover_standby_SID.log
- usa
missingok
para permitir que la limpieza logrotate suceda - establezca la
rotate
lo suficientemente alta, para cubrir la cantidad de archivos de registro que se mantendrán (al menos 7, si habrá un archivo de registro "rotado" por día, pero puede establecerlo de manera muy alta, como 9999) - establezca el
maxage
de 7. Esto eliminará los archivos cuya última modificación sea superior a 7 días. -
dateext
se usa solo para asegurar que logrotate busque archivos antiguos que parecen rotados.
El archivo de configuración de Logrotate se vería así:
data/tier2/scripts/logs/recover_standby_SID.log {
daily
missingok
rotate 9999
maxage 7
dateext
}
Solución: rotar directamente por logrotate una vez al día.
No estoy seguro de cómo se crea el archivo de espera de recuperación de origen, pero supongo que Oracle o alguna secuencia de comandos suya se está agregando regularmente o continuamente a un archivo /data/tier2/scripts/logs/recover_standby_SID.log
El concepto es:
- Gira el archivo una vez al día por
logrotate
- trabajando directamente con el archivo de registro que contiene los datos de recuperación
/data/tier2/scripts/logs/recover_standby_SID.log
-
daily
causará rotación una vez al día (en términos de cómocron
entiendedaily
) -
rotate
debe establecer en 7 (o en cualquier número mayor). -
maxage
establecido en 7 (dias) -
dateext
para usar el sufijo de fecha de logrotate predeterminado -
dateyesterday
usado para causar sufijos de fecha en archivos rotados que se devolvieron hace un día. -
missingok
para limpiar archivos antiguos incluso cuando no hay contenido nuevo para rotar.
La configuración de Logrotate se vería así:
data/tier2/scripts/logs/recover_standby_SID.log {
daily
missingok
rotate 7
maxage 7
dateext
dateyesterday
}
Tenga en cuenta que es posible que necesite jugar un poco con copytruncate
y otras opciones similares relacionadas con cómo se crea el archivo de registro de origen mediante un proceso externo y cómo reacciona al acto de rotación.
Para tu información, sé que esta es una pregunta antigua, pero la razón por la que no funciona para ti es porque tu formato de fecha no es léxicamente clasificable. De la página del manual:
dateformat format_string
Specify the extension for dateext using the notation similar to strftime(3) function. Only
%Y %m %d and %s specifiers are allowed. The default value is -%Y%m%d. Note that also the
character separating log name from the extension is part of the dateformat string. The sys-
tem clock must be set past Sep 9th 2001 for %s to work correctly. Note that the datestamps
generated by this format must be lexically sortable (i.e., first the year, then the month
then the day. e.g., 2001/12/01 is ok, but 01/12/2001 is not, since 01/11/2002 would sort
lower while it is later). This is because when using the rotate option, logrotate sorts all
rotated filenames to find out which logfiles are older and should be removed.
La solución es cambiar a uno que vaya año-mes-fecha, o llamar a un proceso externo para realizar la limpieza.
(No se puede comentar como no tiene suficiente reputación)
Tuve un problema similar Por todas las cuentas logrotate es inútil para su uso en nombres de archivos con marcas de datos incorporadas.
Si todo lo demás fuera igual, probablemente iría a find
en un trabajo cron.
Por mis propias razones, quería usar logrotate y, finalmente, encontré una forma: https://.com/a/23108631
En esencia, era una forma de encapsular el trabajo cron en un archivo logrotate. Tal vez no sea la más bonita ni la más eficiente, pero como dije, tenía mis razones.