Come devo gestire gli errori del logger?


12

In molte applicazioni della nostra azienda, utilizziamo un logger personalizzato. È abbastanza robusto, anche se in futuro potremmo sostituirlo con qualcosa come NLog. Una delle attività del logger è quella di registrare eventuali eccezioni riscontrate nell'applicazione.

Una preoccupazione che ho sempre avuto è che la gestione delle eccezioni nel logger consente un errore silenzioso. Cioè, se il registro non è scritto per una determinata eccezione (a causa di un errore nel logger), come devo gestirlo e (in qualche modo) registrare l'eccezione nel logger stesso ?

Diciamo che la funzione WriteLog genera un'eccezione. Dovrei provare a chiamare la funzione un numero di volte o fino a quando non viene generata l'eccezione? Dovrei provare a scrivere l'eccezione generata con il logger (che probabilmente comporterebbe eccezioni fino in fondo ...)? Ho avuto la fortuna di non incontrare questa situazione tranne quando stavamo implementando il logger personalizzato. D'altra parte, non ho modo di sapere al momento se il logger non è riuscito a registrare le eccezioni dell'applicazione (a causa delle sue eccezioni).

Ho provato a cercare online e su alcuni siti SE, ma è stato finora inutile poiché tutti i post trattano errori in un logger (ma non potenziali eccezioni e come registrarli) o eccezioni al di fuori del logger.



5
Accedere a stderrche il supporto di output non è riuscito o che è successo "impossibile".
Doval,

1
Invia un'email agli sviluppatori o visualizza semplicemente l'errore con un indirizzo email e consenti all'utente di copiare e incollare l'errore.
Chloe,

Risposte:


17

Quando si verificano eccezioni all'interno del logger stesso, non è necessario utilizzare il logger per registrare le proprie eccezioni. Il motivo è che:

  • Potresti essere bloccato in un ciclo infinito. Immagina che all'interno del tuo logger, hai un ramo condizionale che non è stato testato (e genera un'eccezione). Immagina che una volta soddisfatta la condizione, ogni ulteriore eccezione segnalata viene gestita dallo stesso ramo. Ciò significa che dal momento in cui il ramo viene eseguito, sei in un ciclo infinito.

  • Potresti essere bloccato in un ciclo temporaneo, generando migliaia di eccezioni al secondo. Immagina di segnalare eccezioni a un server remoto. Un problema con il server provoca un'altra eccezione, che ne provoca un'altra e così via, fino a quando la connessione non viene ripristinata.

Quello che dovresti fare invece è ricorrere a un modo più sicuro per registrare le eccezioni. Ad esempio, se il logger invia le eccezioni a un server remoto, inviare invece le eccezioni all'interno del logger syslog. Se il logger registra le eccezioni in Eventi di Windows e questa azione ha esito negativo, archiviare l'eccezione di errore in un semplice file di testo.

Una volta che hai quello, la domanda successiva è come fai a sapere che si sono verificate queste eccezioni: se hai decine di applicazioni in esecuzione su migliaia di server, non puoi probabilmente SSH ognuna di esse su base regolare per verificare se stavano registrando qualcosa localmente .

Un modo è quello di avere un cron job che controlli quei "registri eccezionali" e li spinge nella posizione in cui sono archiviate altre eccezioni (eventualmente usando il tuo logger, ma fai attenzione a loop infiniti o temporanei!).


Ho riscontrato questo stesso problema con il mio registratore di eccezioni che è andato a e-mail. Se non è riuscito a connettersi a un server, è entrato in un terribile loop infinito. Pertanto, ho inserito un segno di spunta per deviare nel registro eventi e impedire l'invio di nuove e-mail fino a quando non è stato possibile stabilire una nuova connessione.
mgw854,

Penso che proveremo a implementare un fallback come suggerisci tu. Il suggerimento di Jon Raynor di interrompere l'applicazione (in una situazione di registrazione critica) è anche uno che potremmo perseguire e che non avevamo considerato.
Zairja,

Cosa succede se si finiscono con i timeout che inviano a syslog o errori di I / O durante la scrittura su un file? Potresti ancora peggiorare il problema, se gli errori sono dovuti a una rete congestionata o a corto di spazio su disco. Questa non è esattamente una soluzione olistica; è necessario considerare la possibilità che non vi sia alcun modo sicuro per registrare gli errori. Non è così pericoloso accedere al proprio logger fintanto che si incorpora il rilevamento del ciclo, il back-off esponenziale, ecc.
Aaronaught,

11

Se la registrazione è fondamentale per l'applicazione, si dovrebbe interrompere l'applicazione se la registrazione non riesce.

Se non critico, allora essendo un po 'difensivo si potrebbe avere un componente secondario per gestire gli errori di registrazione che registra / avvisa su una fonte secondaria. Ma anche questo non è infallibile e dovrai considerare cosa succede se il logger secondario fallisce mentre sta monitorando il logger primario.

Una buona strategia è la registrazione su un file locale e, in caso contrario, è possibile che si verifichi tale errore nel registro eventi, la generazione di un avviso e-mail, il salvataggio su un database, ecc. Con i framework di registrazione disponibili, questo dovrebbe essere infallibile a meno che la macchina non funzioni spazio su disco insufficiente o qualche altra condizione rara.

Idealmente, la soluzione migliore fallisce in modo silenzioso poiché ciò renderà l'applicazione meno complessa.

Ancora più importante, per gestire gli errori di registrazione è necessario monitorare i registri da una terza parte. Nel tempo dovresti essere in grado di discernere quanti eventi sta registrando un'applicazione sana. Se inizia a registrare eventi bassi o inesistenti, attraverso il monitoraggio è possibile verificare il problema e potenzialmente avvisare attraverso quel meccanismo di terze parti.


1
+1 per distinguere tra registrazione critica e non critica, nonché notare l'importanza del numero di registri per intervallo di tempo. Sono deluso dal fatto di non aver pensato a questi due aspetti, mentre uso la registrazione di fallback da anni.
Arseni Mourzenko,
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.