Forma adecuada de rotar los registros de Nginx

12

Me gustaría lograr la rotación de los registros de nginx que:

  1. funcionaría sin ningún software adicional (es decir, mejor si no tiene "logrotate")
  2. crearía archivos rotados con nombres basados ​​en la fecha

El mejor enfoque es algo similar a PostgreSQL, es decir, en su variable de configuración log_filename puedo especificar strftime-style% Y-% m-% d, y cambiará automáticamente el cambio de fecha (u hora) de inicio de sesión.

Otro enfoque de apache: enviar registros a través de la tubería al programa rotatelogs.

Hasta donde pude buscar, no existe tal enfoque. Todo lo que puedo hacer es usar logrotate con la opción dateext, pero tiene su propio conjunto de inconvenientes, y prefiero usar algo que funcione como | rotatelogs o log_filename en PostgreSQL.

Bryan
fuente
Este artículo de blog describe una posible solución para su problema. Pero tengo una pregunta: ¿por qué no quieres usar logrotate? Hace el trabajo muy bien, casi no tiene dependencias y está comprobado que funciona (endurecido por la batalla, por así decirlo). ¿Por qué saltar a través de los aros y usar una solución local que puede ser inferior y propensa a errores, si solo pudiera usar logrotate (que también puede ser útil para rotar algunos otros registros en esa máquina)?
joschi
logrotate (con dateext) casi funciona, pero no me gusta porque tiene que ejecutarse a través de cron, y esto tiene algunos inconvenientes.
Dado que nginx no admite la canalización de sus registros a otros programas, no admite la rotación de registros por sí mismo y no le gusta un enfoque basado en cron, es posible que no obtenga lo que desea. A veces, "casi funciona" es tan bueno como parece. ;) A menos que, por supuesto, desee parchear nginx usted mismo.
joschi

Respuestas:

7

Si bien el mundo está dividido sobre si la humilde pipa con nombre es amiga o enemiga, probablemente sea la solución más simple para su problema. Tiene algunos inconvenientes (ya que necesita crear las tuberías con anticipación), pero elimina la necesidad de un cron y le permite utilizar el filtro de tubería de registro que elija.

Aquí hay un ejemplo usando cronolog en access.log:

  1. Elija un camino para nuestra tubería con nombre. Tengo la intención de mantener mis registros /var/log/nginx, así que también pondré mis tuberías allí. El nombre depende de ti; Añado .fifo, y está access.log, así que el mío estará en /var/log/nginx/access.log.fifo.
  2. Elimine el archivo si existe.
  3. Haga una tubería con nombre para el archivo de registro:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. Configure nginx.confpara apuntar el registro a la tubería que acaba de hacer:

    access_log /var/log/nginx/access.log.fifo;
    
  5. Modifique su script init.d para iniciar el rotador de registros escuchando la tubería antes de iniciar el servidor:

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    Se usaría una línea de comando similar rotatelogssi lo prefiere cronolog: vea sus documentos para la sintaxis.

    Si su distribución tiene un start-stop-daemon, debería usarlo en su lugar, ya que teóricamente tiene cualquier conocimiento especial sobre su plataforma que existe y cuidar de pkillusted. Simplemente envuelva el comando en un script, y pasarlo como --execa start-stop-daemonen su init.d/nginx.

dsc
fuente
Me encanta cronolog; Es bueno ver a más personas usándolo / recomendándolo.
natacado
1

He escrito un programa simple, registro de fechas, para dividir registros comunes en función de la fecha registrada, en lugar de la hora actual del sistema cuando el programa ve la línea de registro. Esto puede o no ser exactamente lo que cronolog u otro divisor de registros ya hace, pero fue más rápido escribir el mío que descubrir qué hacen los demás.

Usando el año y el mes en la solicitud registrada, la línea se escribe en un archivo o tubería que incluye el AAAAMM calculado a partir de los datos registrados. Sí, esto es algo específico para el formato de registro común. El primero [se supone que delimita la fecha. Cuidado con las direcciones IPv6. :)

Para el análisis de registros es importante que cada registro realmente solo contenga las solicitudes para cada mes respectivo, y cada registro idealmente debe estar completo para obtener resultados de análisis correctos. No es suficiente determinar el nombre de archivo en función del tiempo actual dentro del divisor de registro, porque una solicitud lenta que comienza a las 23:59:59 terminará en el archivo de registro para el mes incorrecto.

Utilizo esto con nginx por medio de un fifo nombrado que se verifica que existe antes de que se inicie nginx. Tenga en cuenta que existe una compensación en el programa entre la detección de errores y la salida almacenada, donde el registro de fechas actualmente prefiere la salida almacenada por razones de rendimiento, por lo tanto, asegúrese de que su configuración realmente funcione, especialmente cuando utilice tuberías de shell, para no perder ningún dato de registro .

Código fuente: http://stuge.se/datelog.c

¡No dude en enviarme cualquier comentario y, por supuesto, parches!

stuge
fuente
1

Puede lograr esto usando un script bash simple y cron:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

Más detalles sobre la configuración de crontab, etc. se encuentran aquí: Rotación de archivos de registro de Nginx a través de Cron

John Collins
fuente
0

Me temo que realmente no entiendo su pregunta: dado que nginx no admite ninguna rotación integrada, tendrá que optar por algo como

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

en algún lugar de /etc/cron.daily (por supuesto, debe calificar los nombres de archivo con los nombres de ruta completos) o instalar las utilidades apache2 para tener acceso a rotatelogs.

Stefan Förster
fuente
Esto es lo mismo que podría hacer con logrotate. Y lo quiero mejor.