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 -
- Apri tre finestre di shell e fai un cd in
/tmp
in ognuna di esse
- Nella prima shell,
cat > file.tmp
-
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)
-
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.
- 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 '?