Mantenimento del flusso di log dopo la modifica del nome del file

1

Sto cercando di accedere a un file e spostarlo ogni 30 secondi circa. Sto usando la funzione os.rename (che eseguo da un processo di supervisione) in python per spostare il log corrente in un log con timestamp (che verrà poi elaborato da un altro script python) e quindi continuo a accedere al vecchio stream dal mio server uwsgi.

Ho anche provato il RotatingFileHandler e la versione a tempo, ma non sembrano funzionare correttamente. Non ero sicuro se fosse una funzione di usarlo con il server uwsgi o no.

La mia domanda è: qual è il modo più semplice ed efficace per continuare a registrare lo stesso nome del file dopo che il file "puntato a" è stato spostato?

    
posta tonyl7126 12.08.2013 - 21:41
fonte

3 risposte

1

Una volta che Python apre un filehandle, continuerà a puntare a quel file anche se il file viene rinominato. (Questo è un comportamento specifico del sistema operativo, ma questo è il comportamento definito da POSIX per Unix.)

Quindi è necessario eseguire la rotazione del registro dall'interno del processo Python, oppure rendere il file che si scrive come una named pipe che gestisce la rotazione del log stesso. Quest'ultimo è probabilmente più facile da configurare. link è un vecchio ma ancora pertinente articolo su come farlo sotto Unix.

    
risposta data 12.08.2013 - 23:36
fonte
0

Apprezzo l'aiuto, ma alla fine il metodo più semplice era aprire e chiudere il file in python per ogni scrittura. Potrebbe non essere il più efficiente, ma funziona.

    
risposta data 14.08.2013 - 01:53
fonte
0

A un livello molto basso, è necessario aprire e chiudere i file per modificare il file in cui sta scrivendo un logger. Questa non è un'opzione, è una necessità con il modo in cui i file funzionano davvero.

La chiamata open() prende un nome di percorso e restituisce un descrittore di file. Questo punta al file stesso. Le modifiche alla voce di directory per il file sono al di fuori di questo e il descrittore di file non interessa davvero.

Una dimostrazione di ciò può essere vista su un sistema unix -

  1. Apri tre finestre di shell e fai un cd in /tmp in ognuna di esse
  2. Nella prima shell, cat > file.tmp
  3. Nella seconda shell, tail -f file.tmp

    A questo punto, tutto ciò che digiti nella finestra del gatto apparirà sulla finestra di coda (potrebbe essere richiesto il ritorno)

  4. nella terza shell, mv file.tmp file.foo

    Hai spostato il file, ma se continui a digitare nella finestra del gatto, verrà comunque visualizzato nella finestra della coda.

  5. Nella terza shell, rm file.foo

    Eppure, ciò che digiti nella finestra cat si presenta nella finestra di coda, anche se non ci sono file in / tmp più.

In # 2, un file è stato aperto, creato sul disco e un descrittore di file è stato utilizzato dalla shell. In # 3, il file sul disco è stato aperto per la lettura e ha ottenuto anche un descrittore di file. I due processi stanno leggendo e scrivendo in un file a cui ciascuno accede con il proprio descrittore di file. Lo spostamento del file sul disco non influisce su questi processi: stanno ancora accedendo allo stesso file. Qualunque cosa sia, anche se il file viene cancellato dalla voce della directory, il file esiste come luogo comune per questi due processi (fino a quando ognuno chiude il file).

L'unico modo per interrompere la connessione tra un descrittore di file e il file è chiudere il file e aprire un nuovo file per recuperare un nuovo descrittore di file.

Molti framework di registrazione hanno un modo per farlo aperto e chiuso per te. In Python (ammetto che sto solo leggendo i documenti su questo), TimedRotatingFileHandler ruoterà il log (e questo è probabilmente il bit importante) sul log successivo dopo il tempo in cui è impostato per ruotare.

Diciamo che hai un logger che sputa circa un messaggio ogni 10 minuti sul 5 (quindi 5, 15, 25, 35, 45 e 55). Hai anche un rotatore log che ruota all'ora. Il file di registro non apparirà ruotato fino a quando non verrà scritto il messaggio del registro 05, quindi il registratore si accorgerà che è dopo il tempo necessario a ruotare e quindi ruota il file di registro, scrivendo il nuovo messaggio 05 in un nuovo file.

Un modo non insolito per risolvere questo problema (e ottenere i registri che ruotano quando vuoi che lo facciano) è di registrare un messaggio di priorità sufficientemente alta da far ruotare i registri appena dopo il tempo necessario a ruotarli.

L'altra cosa da fare è aspettare un po '. Hai davvero bisogno di spostare quel file di registro ora ? O può restare per un po '?

    
risposta data 14.08.2013 - 05:00
fonte

Leggi altre domande sui tag