Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NLog configured to automatically log all exceptions?

Tags:

c#

nlog

Is there a way to configure NLog to automatically log all exceptions my application can send? Currently I am going to all TRY/CATCH blocks and manually adding logging in the CATCH - but what if I miss some? And what if in the future someone else does

Is there a way to tell NLog to just always log all exceptions? Esspecially some that are not caught and could cause a popup?

like image 274
JSchwartz Avatar asked Dec 15 '12 20:12

JSchwartz


People also ask

What can be configured with this NLog config file?

The following types can be configured: Targets - the destinations of a logevent, e.g. file, database, console. Layout - the layout e.g. json, csv, plain-text (default) Layout renderers - the template markers, e.g. ${message}, ${exception}, ${date}

What types of logs are supported in the NLog library?

NLog supports semantic/structured logging known from similar frameworks like Serilog and Microsoft. Extensions. Logging. With structured logging, you no longer log just simple text messages.


1 Answers

As far as I know, there is no way to confineNLog to log all exceptions.

If all you want is to log unhandled exceptions, you could add an "UnhandledException Handler" to the AppDomain when initializing your application. Note that under some circumstances it may not be possible to log the error (e.g. in case of an OutOfMemory exception or something terrible).

Note that the AppDomain also has a FirstChanceException event you can subscribe to, but this would mean that you get notified about every exception that occurs (and may be handled by the usercode) - in this are many.

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
}

Note that this will only allow you to log exceptions that cause your application to crash - you cannot prevent it to crash (therefore the name: unhandled exception).

Another option would be to use Aspect Oriented Programming (AOP) - and introduce a Logging aspect after each method call, in case of an error. If your application uses a Layered architecture, this may be relatively easy to do (e.g. add an aspect to all calls of your business logic layer...).

You may find a framework like PostSharp or Spring.Net useful (usually their websites provide some easy examples for that).

like image 89
Bernhard Kircher Avatar answered Oct 22 '22 13:10

Bernhard Kircher