Modo corretto per ruotare i registri di Nginx


12

Vorrei ottenere la rotazione dei registri nginx che:

  1. funzionerebbe senza alcun software aggiuntivo (cioè - meglio se senza "logrotate")
  2. creerebbe file ruotati con nomi in base alla data

L'approccio migliore è qualcosa come PostgreSQL - cioè nella sua variabile di configurazione log_filename posso specificare lo stile strftime% Y-% m-% d, e cambierà automaticamente la data di accesso (o l'ora).

Un altro approccio da apache: l'invio di registri tramite pipe al programma rotatelogs.

Per quanto ho potuto cercare, non esiste un simile approccio. Tutto quello che posso fare è usare logrotate con l'opzione dateext, ma ha il suo set di svantaggi e preferirei usare qualcosa che funzioni come | rotatelogs o log_filename in PostgreSQL.


Questo articolo di blog descrive una possibile soluzione al tuo problema. Ma ho una domanda: perché non vuoi usare logrotate? Fa molto bene il lavoro, non ha quasi dipendenze e ha dimostrato di funzionare (indurito dalla battaglia se vuoi). Perché saltare attraverso i cerchi e utilizzare una soluzione fatta in casa che può essere inferiore e soggetta a errori, se solo potessi usare logrotate (che può anche essere utile per ruotare alcuni altri registri su quella macchina)?
joschi,

logrotate (con dateext) funziona quasi , ma non mi piace perché deve essere eseguito tramite cron, e questo ha alcuni inconvenienti.

Poiché nginx non supporta il piping dei suoi registri ad altri programmi, non supporta la rotazione dei registri da solo e non ti piace un approccio basato su cron, potresti non ottenere esattamente ciò che desideri. A volte "quasi funziona" è bello come si arriva. ;) A meno che, ovviamente, non vogliate riparare voi stessi nginx.
joschi,

Risposte:


7

Mentre il mondo è diviso sul fatto che l'umile pipa di nome sia amico o nemico, è probabilmente la soluzione più semplice al tuo problema. Presenta alcuni inconvenienti (in quanto è necessario creare le pipe in anticipo), ma elimina la necessità di un cron e consente di utilizzare il filtro pipe di registrazione di propria scelta.

Ecco un esempio usando cronolog su access.log:

  1. Scegli un percorso per la nostra pipa denominata. Ho intenzione di tenere i miei log in /var/log/nginx, quindi inserirò anche le mie pipe. Il nome dipende da te; Aggiungo .fifo, ed è access.log, quindi il mio sarà a /var/log/nginx/access.log.fifo.
  2. Elimina il file se esiste.
  3. Crea una pipe con nome per il file di registro:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. Configurare nginx.confin modo che punti il ​​registro sulla pipe appena creata:

    access_log /var/log/nginx/access.log.fifo;
    
  5. Modifica il tuo script init.d per avviare il log rotator in ascolto della pipe prima di avviare il server:

    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" ) &
    

    Una riga di comando simile verrebbe utilizzata rotatelogsse lo preferisci, cronologvedi i loro documenti per la sintassi.

    Se la tua distrobution ha un start-stop-daemon, dovresti usarlo invece, poiché teoricamente ha qualsiasi conoscenza speciale sulla tua piattaforma che ci sia, e prendersi cura di pkillte. Basta avvolgere il comando in uno script, e passarlo come --execa start-stop-daemonnel vostro init.d/nginx.


Adoro cronolog; è bello vedere più persone che lo usano / lo consigliano.
natacado,

1

Ho scritto un semplice programma, log dati, per dividere i registri comuni in base alla data di registrazione, al contrario dell'ora di sistema corrente quando la linea di registro viene vista dal programma. Questo potrebbe essere o meno esattamente ciò che cronolog o un altro splitter di log fa già, ma è stato più veloce scrivere il mio che scoprire cosa fanno gli altri.

Utilizzando l'anno e il mese nella richiesta registrata, la riga viene quindi scritta in un file o pipe che include il AAAAMM calcolato dai dati registrati. Sì, questo è in qualche modo specifico per il formato di registro comune. Il primo [si presume che delimiti la data. Attenzione agli indirizzi IPv6. :)

Per l'analisi dei registri è importante che ogni registro contenga realmente solo le richieste per ciascun rispettivo mese e che ogni registro dovrebbe idealmente essere completo per risultati di analisi corretti. Non è sufficiente determinare il nome file in base all'ora corrente all'interno dello splitter di registro, poiché una richiesta lenta che inizia alle 23:59:59 finirà nel file di registro per il mese sbagliato.

Lo uso con nginx per mezzo di un file fifo che viene verificato prima che venga avviato nginx. Si noti che esiste un compromesso nel programma tra il rilevamento degli errori e l'output in buffer, in cui il log di dati attualmente preferisce l'output in buffer per motivi di prestazioni, quindi assicurarsi che la propria configurazione funzioni davvero, specialmente quando si utilizzano pipe shell, al fine di non perdere alcun dato di registro .

Codice sorgente: http://stuge.se/datelog.c

Non esitate a inviarmi qualsiasi feedback e ovviamente patch!


1

Puoi farlo usando un semplice script bash e 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

Ulteriori dettagli sulla configurazione di crontab ecc. Sono disponibili qui: Rotazione dei file di registro di Nginx tramite Cron


0

Temo di non capire davvero la tua domanda: poiché nginx non supporta alcun logrotation integrato, dovrai scegliere qualcosa come

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

da qualche parte in /etc/cron.daily (è necessario qualificare i nomi dei file sopra con i percorsi completi, ovviamente) o installare i programmi di utilità apache2 per avere accesso ai rotatelogs.


Questo è lo stesso che potrei fare con logrotate. E lo voglio meglio.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.