Logrotate no funciona

18

Estoy tratando de hacer que logrotate funcione en mi VPS para rotar mis archivos apache semanalmente. Actualmente el contenido del archivo de configuración apache2 es como tal.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Lo he dejado durante dos semanas y nada ha cambiado hasta donde puedo decir. Cuando lo simulo desde la línea de comando obtengo el siguiente resultado.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

¿Alguna idea de lo que Iv'e configuró mal?

Mi archivo de estado también está vacío :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Actualizar

¡Eliminé el archivo de estado e hice una ejecución forzada de logrotate y ahora los registros parecen haber sido rotados y el archivo de estado parece más prometedor!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Malaquías
fuente

Respuestas:

17

Creo que eso weeklysignifica que logrotate quiere ver al menos una entrada de una semana para su archivo access.log para rotarlo.

Por lo tanto, el problema parece ser que no está almacenando la entrada de estado para activar la rotación.


Aquí hay un ejemplo detallado del caso simple, de cómo logrotate decide rotar un archivo de registro
(estas son rutas de fedora, Ubuntu, Centos, etc. pueden ser diferentes)

(Hice algunas solicitudes para http://localhostque haya algunas entradas en access_log, de lo contrario, logrotate nunca gira ...)

Así que configuré mi logrotate para apache a semanal así;

/var/log/httpd/*log {
        weekly
...
}

y originalmente no hay entrada en el /var/lib/logrotate.statusarchivo

# grep access_log /var/lib/logrotate.status
<- nothing

Entonces logrotate no gira el access_logarchivo;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Sin embargo, si ejecuto logrotate manualmente, así;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

ahora hay una entrada en el archivo de estado para el httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Sin embargo, apache todavía no va a rotar el registro, porque la entrada tiene solo 0 días (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Sin embargo, si edita el archivo de estado con vi, vi /var/lib/logrotate.statusalgo como esto para establecer la fecha en más de una semana ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Luego, logrotate ahora rota correctamente el archivo debido a que la fecha en el archivo de estado 2012-4-11es hace más de una semana a partir de hoy2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(tenga en cuenta que esto -dprovoca una ejecución en seco, por lo tanto, solo es útil para la inspección, debe ejecutar el comando sin -dhacer entradas de estado o rotar archivos, etc.)

Tom H
fuente
1
Los archivos de registro tenían entradas de más de una semana de antigüedad. Parece que está funcionando ahora, sin embargo, supongo que lo descubriré dentro de una semana ...
Malachi
2
Lo siento, podría haber sido más claro en la respuesta, pero creo que para una rotación semanal necesita una entrada en el archivo /var/lib/logrotate.statuscon una fecha de al menos una semana de antigüedad. Actualicé la respuesta con un ejemplo ...
Tom H
Gracias por una explicación tan clara: entiendo totalmente el lado de la fecha de las cosas, es solo que no rotan a menos que llame manualmente al comando ... ¿Es como si CRON no está llamando al registro rotar?
Malaquías
Soy relativamente nuevo en la administración de Linux ... Dentro de /etc/cron.daily/logrotate/ hay: #! / Bin / sh test -x / usr / sbin / logrotate || salida 0
Malachi
7
log does not need rotating

Esto puede deberse a que los archivos de registro están vacíos.
Esta situación puede ocurrir porque Apache todavía escribe en un archivo de registro anterior, que ha sido renombrado sin reiniciar Apache. Entonces access.log se convirtió en access.log.1 y Apache escribe en él.

O tiene un problema con el tiempo de creación del registro:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
fuente
Puede comentar la notifemptylínea para tratar con los registros de 0 bytes que no rotan. Luego, querrá touchun nuevo archivo de registro antes de cada prueba para que logrotate tenga algo que rotar.
Banjer
6

Me enfrenté a un problema similar, excepto que ninguna de estas respuestas me ayudó. Mi archivo de registro era enorme y viejo, mi configuración era 100% correcta y válida, eliminar el archivo de estado no ayudó.

Resultó que el problema estaba en entradas de logrotate duplicadas . Cuando ejecuto logrotate manualmente en mi archivo de configuración solo así:

logrotate -df /etc/logrotate.d/my_service_name

no mostró ningún error, solo dijo:

log does not need rotating

Todavía no sé por qué en realidad. Pero cuando ejecuto un comando logrotate completo como ese:

logrotate -f /etc/logrotate.conf

Tengo la siguiente línea:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Resultó que el archivo de configuración logrotate para mi servicio contenía las entradas para rotar los registros de acceso nginx, así como los registros del servicio en sí. Y eso entró en conflicto con la configuración de logrotate de ngnix, que tiene una regla para todas las entradas nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Entonces, la solución para mi caso es bastante simple: solo tuve que eliminar la regla de rotación de registros nginx en conflicto de mi configuración .

Supongo que logrotate comenzó a abortar el procesamiento del archivo en conflictos de reglas solo desde una de las versiones más recientes. Recibo este error con v.3.8.7 pero en v.3.7.8 con la misma configuración conflictiva escribe el mismo error pero gira bien. Aunque no pude encontrar ningún registro de eso en el registro de cambios logrotate.

Inocencia
fuente
Parece que tienes razón sobre las versiones más recientes. También tenía entradas duplicadas; pero cuando se ejecuta logrotate manualmente; Funcionó bien. Por la noche valor de retorno 0; pero no se ejecutó correctamente ...
Chris Maes
2

Intente ejecutar sudo logrotate -f --verbose /etc/logrotate.d/apache2 Vea lo que está escrito en la consola y arregle todo lo que esté mal.

Aminah Nuraini
fuente
0

Tenía una máquina Debian 7 que, después de una actualización del sistema, ya no giraba los registros de correo. Todos los demás registros, excepto los de correo, se rotaron correctamente. Descubrí que los registros de correo habían crecido varios gigabytes. Siempre logré la rotación de registros a través de Webmin. Entonces, corriendo logrotate -d /etc/logrotate.confvi el siguiente mensaje:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

¡Resultó que mis entradas de rotación de correo estaban enlistadas /etc/logrotate.d/rsyslog.dpkg-old, lo cual fue ignorado! Cambiar el nombre del archivo corrigió la rotación del archivo de registro :-)

lucaferrario
fuente