Come dovrei gestire gli errori del logger?

12

In molte delle applicazioni della nostra azienda, utilizziamo un logger personalizzato. È abbastanza robusto, anche se potremmo sostituirlo con qualcosa come NLog in futuro. Una delle attività del logger consiste nel registrare tutte le eccezioni incontrate nell'applicazione.

Una preoccupazione che ho sempre avuto è che la gestione delle eccezioni all'interno del logger consente un errore silenzioso. Cioè, se il log non è scritto per una determinata eccezione (a causa di un errore nel logger), come dovrei 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 certo numero di volte o fino a quando l'eccezione non viene lanciata? Dovrei provare a scrivere l'eccezione generata con il logger (che probabilmente produrrebbe solo 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 proprie eccezioni).

Ho provato a cercare online e su alcuni siti SE, ma finora è stato infruttuoso dal momento che tutti i post riguardano gli errori in un logger (ma non le potenziali eccezioni e come registrarli) o con eccezioni al di fuori del logger.

    
posta Zairja 12.12.2014 - 18:22
fonte

2 risposte

17

Quando si incontrano eccezioni all'interno del logger stesso, non si deve usare 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 venga gestita dallo stesso ramo. Ciò significa che dal momento dell'esecuzione del ramo, sei in un ciclo infinito.

  • Potresti rimanere 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 causa un altro e così via, fino a quando la connessione è tornata.

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, invia invece le eccezioni all'interno del registratore a syslog . Se il registratore registra eccezioni in Eventi di Windows e questa azione non riesce, salva l'eccezione di errore in un semplice file di testo.

Una volta che hai fatto, la prossima domanda è come sai che si sono verificate queste eccezioni: se hai decine di applicazioni in esecuzione su migliaia di server, non puoi possibilmente SSH ognuno di loro su base regolare per verificare se erano registrando qualcosa localmente.

Un modo è avere un lavoro cron che controlla quei "registri eccezionali" e li spinge nella posizione in cui sono archiviate altre eccezioni (eventualmente usando il logger, ma attenzione ai loop infiniti o temporanei!).

    
risposta data 12.12.2014 - 18:38
fonte
11

Se la registrazione è fondamentale per l'applicazione, è necessario arrestare l'applicazione se la registrazione fallisce.

Se non è critico, quindi essendo un po 'difensivo, si potrebbe avere un componente secondario per gestire gli errori di registrazione che registra / segnala a un'origine secondaria. Ma anche questo non è infallibile e dovrai considerare cosa succede se il logger secondario fallisce mentre sta monitorando il logger principale.

Una buona strategia è l'accesso a un file locale e se ciò non riesce, forse registrando tale errore nel registro eventi, generando un avviso e-mail, salvando in un database, ecc. Con i framework di registrazione disponibili questo dovrebbe essere infallibile a meno che la macchina esaurisce lo spazio su disco o altre rare condizioni.

Idealmente, è meglio che tu stia fallendo silenziosamente, poiché ciò renderà l'applicazione meno complessa.

Ancora più importante, per gestire gli errori di registrazione si dovrebbe monitorare i registri da una terza parte. Nel tempo dovresti essere in grado di discernere quanti eventi sta registrando un'applicazione sanitaria. Se inizia la registrazione di eventi bassi o assenti, attraverso il monitoraggio puoi vedere il problema che si verifica e potenzialmente avvisare tramite quel meccanismo di terze parti.

    
risposta data 12.12.2014 - 19:48
fonte