Domanda

Ho un sito in esecuzione su Django. Frontend è lighttpd e sta usando fcgi per ospitare django.

Inizio i miei processi fcgi come segue:

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid

Per la registrazione, ho un RotatingFileHandler definito come segue:

file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8')

La registrazione funziona. Tuttavia, sembra che i file stiano ruotando quando non raggiungono nemmeno i 10 KB, per non parlare dei 10 Mb. La mia ipotesi è che ogni istanza di FCC stia gestendo solo 10 richieste e quindi ricompaia. Ogni respawn di fcgi crea un nuovo file. Confermo che fcgi si avvia con un nuovo ID processo ogni tanto (tempo difficile da dire esattamente, ma meno di un minuto).

Esiste un modo per aggirare questo problema? Vorrei che tutte le istanze di FCG registrassero su un file fino a quando non raggiungesse il limite di dimensione, a quel punto avrebbe luogo una rotazione del file di registro.

È stato utile?

Soluzione

Come affermato da Alex, la registrazione è thread-safe, ma i gestori standard non possono essere utilizzati in modo sicuro per accedere da più processi in un singolo file.

ConcurrentLogHandler utilizza il blocco dei file per consentire la registrazione da più processi.

Altri suggerimenti

Nelle tue scarpe passerei a un TimedRotatingFileHandler - - Sono sorpreso che gli handle di file rotanti basati sulla dimensione stiano dando questo problema (poiché dovrebbe essere impermeabile a quali processi stanno producendo le voci del registro), ma la versione a tempo (sebbene non controllata esattamente sul parametro che preferisci) dovrebbe risolvere esso. Oppure, scrivi il tuo, più solido, gestore di file rotante (puoi prendere molto dalle fonti della libreria standard) che garantisce che i vari processi non siano un problema (come non dovrebbero mai essere).

Poiché sembra che tu stia utilizzando la modalità di apertura del file predefinita di append (" a ") piuttosto che scrivere (" w "), se un processo si ricompone, dovrebbe essere aggiunto al file esistente, quindi rollover quando il limite di dimensioni raggiunto. Quindi non sono sicuro che ciò che stai vedendo sia causato dalla rigenerazione dei processi CGI. (Questo ovviamente presuppone che il nome file rimanga lo stesso quando il processo ricompare).

Sebbene il pacchetto di registrazione sia thread-safe, non gestisce l'accesso simultaneo allo stesso file da più processi, poiché non esiste un modo standard per farlo in stdlib. Il mio consiglio normale è quello di impostare un processo daemon separato che implementa un server socket e registri gli eventi ricevuti attraverso di esso su file; gli altri processi implementano quindi un SocketHandler per comunicare con il demone di registrazione. Quindi tutti gli eventi verranno serializzati su disco correttamente. La documentazione di Python contiene un funzionante socket server che potrebbe servire da base per questa esigenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top