2012-12-15 19 views
11

C'è un modo per configurare NLog per registrare automaticamente tutte le eccezioni che la mia applicazione può inviare? Attualmente sto andando a tutti i blocchi TRY/CATCH e aggiungendo manualmente la registrazione nel CATCH - ma cosa succede se mi manca qualcuno? E se in futuro qualcun altro lo faNLog configurato per registrare automaticamente tutte le eccezioni?

C'è un modo per dire a NLog di registrare sempre tutte le eccezioni? Essenzialmente alcuni che non vengono catturati e potrebbero causare un popup?

risposta

15

Per quanto ne so, non c'è modo di limitareNLog per registrare tutte le eccezioni.

Se invece si è interessati per accedere eccezioni non gestite, è possibile aggiungere un "UnhandledException Handler" per il dominio di applicazione durante l'inizializzazione dell'applicazione. Si noti che in alcune circostanze potrebbe non essere possibile registrare l'errore (ad esempio in caso di un'eccezione OutOfMemory o qualcosa di terribile).

Si noti che il dominio di applicazione ha anche un evento FirstChanceException è possibile sottoscrivere, ma questo significherebbe che da cui ricevi notifiche ogni eccezione che si verifica (e potrebbe essere gestita dal codice utente) - in questo sono molti.

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException); 

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // use logger here to log the events exception object 
    // before the application quits 
} 

Si noti che questo sarà solo la richiesta di login eccezioni che causano l'applicazione per incidente - non si può impedire il crash (quindi il nome: un'eccezione non gestita).

Un'altra opzione sarebbe quella di utilizzare Aspect Oriented Programming (AOP) - e introdurre un aspetto di registrazione dopo ogni chiamata di metodo, in caso di errore. Se l'applicazione utilizza un'architettura a livelli, questa operazione potrebbe essere relativamente semplice (ad esempio, aggiungere un aspetto a a tutte le chiamate del livello della logica aziendale ...).

È possibile trovare un quadro come PostSharp o Spring.Net utile (in genere i loro siti Web forniscono alcuni esempi facili per questo).

+0

Qual è la portata di questo AppDomain? Otterrà tutte le eccezioni non gestite nel mio progetto o solo per classe? Inoltre, faccio riferimento a qualche DLL e cosa ne è dell'eccezione? Devo aggiungere questo codice a ciascuna DLL (che sono i propri progetti)? – JSchwartz

+1

Un Appdomain è un concetto .net per definire un limite isolato per un'applicazione. Se si crea un'applicazione Console, questa verrà eseguita all'interno di un AppDomain. Tutti gli assembly richiesti verranno caricati nello stesso AppDomain. Se qualcosa accade all'interno dell'applicazione (indipendentemente dall'assemblaggio) si verificherà nella stessa appdomain. Solitamente il codice di esempio viene inserito una sola volta all'inizio dell'applicazione (ad esempio nel metodo Main della tua app o in caso di una WebApp in global.asax nel metodo application_start). vedere http://msdn.microsoft.com/en-us/library/system.appdomain.aspx –

0

Per WebAPI applicazione si può fare questo in Global.asax.cs genere

protected void Application_Error() 
{ 
    Exception lastException = Server.GetLastError(); 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Fatal(lastException); 
} 

MSDN resource

Problemi correlati