Me gustaría lograr la rotación de los registros de nginx que:
- funcionaría sin ningún software adicional (es decir, mejor si no tiene "logrotate")
- 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.
Respuestas:
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
:/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
.Haga una tubería con nombre para el archivo de registro:
Configure
nginx.conf
para apuntar el registro a la tubería que acaba de hacer:Modifique su script init.d para iniciar el rotador de registros escuchando la tubería antes de iniciar el servidor:
Se usaría una línea de comando similar
rotatelogs
si lo prefierecronolog
: 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 depkill
usted. Simplemente envuelva el comando en un script, y pasarlo como--exec
astart-stop-daemon
en suinit.d/nginx
.fuente
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!
fuente
Puede lograr esto usando un script bash simple y cron:
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
fuente
Me temo que realmente no entiendo su pregunta: dado que nginx no admite ninguna rotación integrada, tendrá que optar por algo como
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.
fuente