views:

2496

answers:

9

Hi, I'm looking for the best way to log errors in an ASP.NET application. I want to be able to receive emails when errors occurs in my application, with detailed information about the Exception and the current Request.

In my company we used to have our own ErrorMailer, catching everything in the Global.asax Application_Error. It was "Ok" but not very flexible nor configurable.

We swithed recently to NLog. It's much more configurable, we can define different targets for the errors, filter them, buffer them (not tried yet). It's a very good improvement.

But I discovered lately that there's a whole Namespace in the .Net framework for this purpose : System.Web.Management and it can be configured in the healthMonitoring section of web.config.

Have you ever worked with .Net health monitoring? What is your solution for error logging?

Thanks,

Vincent

A: 

We use a custom home grown logging util we wrote. It requires you to implement logging on your own everywhere you need it. But, it also allows your to capture alot more then just the exception.

For exmaple our code would like like this:


Try
  Dim p as New Person()
  p.Name = "Joe"
  p.Age = 30
Catch ex as Exception
  Log.LogException(ex,"Err creating person and assigning name/age")
  Throw ex
End Try

This way our logger will write all the info we need to a sql db. We have email alerts set up at the db level to look for certain errors or frequently occurring errrors. It helps us identify exactly where the errors are coming from.

This might not be exactly what you're looking for. Another approach similar to using Global.asax is to us a code injection technique like AOP with PostSharp. This allows you to inject custom code at the beginning and end of every method or on every exception. It' an interesting approach but I believe it may have a heavy performance overhead.

brendan
A: 

My team uses log4net from Apache. It's pretty lightweight and easy to setup. Best of all, it's completely configurable from the web.config file, so once you've got the hooks in your code setup, you can completely change the way logging is done just by changing the web.config file.

log4net supports logging to a wide variety of locations - database, email, text file, Windows event log, etc. My team has it configured to send detailed error information to a database, and also send an email to the entire team with enough information for us to determine in which part of the code the error originated. Then we know who is responsible for that piece of code, and they can go to the database to get more detailed information.

bcwood
+8  A: 

I use elmah. It has some really nice features and here is a CodeProject article on it. I think the StackOverflow team uses elmah also!

Dale Ragan
+3  A: 

@bcwood As far as I know, log4net and NLog are very similar and share the same goal(logging anything you need anywhere you want). I like NLog but I'm just looking for unhandled error logging so I wonder if there's not a more specific solution.

@Dale Ragan Elmah seems interesting for what I'm looking for (ie unhandled error logging only). I will definitely have a look at it. I like the fact that I can subscribe to a RSS feed of the errors, it's less intrusive than emails. If it is used by the Stack Overflow dev team, it would be nice to have your opinion guys !

I found this interesting article from Phil Haack. It's about elmah but in the comments are discussed the difference between elmah, NLog and .Net Health Monitoring.

Thanks for your answers

Vincent

Costo
+1  A: 

I've been using the Enterprise Library's Logging objects. It allows you to have different types of logging (flat file, e-mail, and/or database). It's pretty customizable and has a pretty good interface for updating your web.config for the configuration of the logging. Usually I call my logging from the On Error in the Global.asax.

Here's a link to the MSDN

Brian Childress
+8  A: 

I've been using Log4net, configured to email details of fatal errors. It's also set up to log everything to a log file, which is invaluable when trying to debug problems. The other benefit is that if that standard functionality doesn't do what you want it to, it's fairly easy to write a custom appender which can process the logging information as required.

Having said that, I'm using this in tandem with a custom error handler which sends out a html email with a bit more information than is included in the standard log4net emails - page, session variables, cookies, http server variables, etc.

These are both wired up in the Application_OnError event, where the exception is logged as a fatal exception in log4net (which then causes it to be emailed to a specified email address), and also handled using the custom error handler.

First heard about Elmah from the Coding Horror blog entry, Crash Responsibly, and although it looks promising I'm yet to implement it any projects.

Mun
+1 Couldn't have said it better myself!
Dillie-O
A: 

I recently built an asp.net webservice with NLog, which I use for all my desktop apps. The logging works fine when I'm debugging in Visual Studio, but as soon as I switch to IIS the log file isn't created; I've not yet determined why, but it the fact that I need to look for a solution makes me want to try something else for my asp.net needs!

+2  A: 

I use CALM because it logs exceptions to the database along with the user's IP address, session ID, page name, request parms, and other useful information, and sends me an email (via a separate notification service) with the details. It also provides a dashboard for all of my apps at a glance.

caveat: i am the author of CALM ;-)

Steven A. Lowe
My apologies for the broken link. Hosting is being moved and CALM is being revamped for v2 with new pricing and a free version; email steven [dot] lowe [at] nov8r.com if interested. This comment will be removed when the link is live again.
Steven A. Lowe
A: 

I use log4net and where ever I expect an exception I log it to the appropriate level. I tend not to re-throw the exception because it doesn't really allow for as-nice user experience, there is less info you can provide at the current state.

I'll have Application_Error also configured to catch any exception which was not expected and the error is logged as a Fatal priority through log4net (well, 404's are detected and logged as Info as they aren't that high severity).

Slace