log4net log all unhandled application errors

28,488

Solution 1

I paste below the code I use on my global.asax that seems to satisfy me for now.. I am getting all unhandled exceptions on my log4net generated log files..

    public class MvcApplication : System.Web.HttpApplication
    {

        private static readonly ILog log = LogManager.GetLogger(typeof(MvcApplication));

        void Application_Error(Object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError().GetBaseException();

            log.Error("App_Error", ex);
        }


        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
            log4net.Config.XmlConfigurator.Configure();

        }

    }

Solution 2

For ASP.NET applications you like to use the System.Web.HttpApplication.Error event which is placed in Global.asax file.

protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    // Stop error from displaying on the client browser
    Context.ClearError();

    logger.Fatal(ex.ToString);

}

watch Managing unhandled exceptions

Solution 3

You might be interested to check out what Aspect Oriented Programming (AOP) is.

We accomplished this with Post sharp (only - we didn't use log4net but custom tracer).

Just check out first if log4net haven't something for this 'out-of-the-box'. I'm not sure about that.

Solution 4

There is no built-in support for this in log4net. You should implement the Application_Error event in Global.asax and call your log4net logger there. The event will be triggered for all unhandled events in your app.

Solution 5

Without being facetious here you go.

        try
        {
            NotImplementedException nie = new NotImplementedException();
            throw nie;
        }
        catch (Exception e)
        {
            Log.Fatal(e);
        }

Assuming you are using .net 3.5, you could use extension methods, and extend System.Exception and add a Log(log4net.ILog log) method, then wherever you catch an exception in your app, assuming you've setup the Log instance correctly, then you easily do it. Your extension class could grow quite a bit, with various overloads for Debug, Info, Warn, Error and Fatal etc.

Share:
28,488
kaivalya
Author by

kaivalya

Updated on April 12, 2020

Comments

  • kaivalya
    kaivalya about 4 years

    Can you point me to some tutorial or samples on how I can log all un-handled exceptions that are occurring on my mvc web app using log4net. Thank you

  • kaivalya
    kaivalya over 14 years
    sorry my question was not clear - I need to log all unhandled exceptions
  • dahlbyk
    dahlbyk over 14 years
    You can also use an HttpModule to register the Error event handler: codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.as‌​px
  • Tr1stan
    Tr1stan over 13 years
    You'll want to add routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); to your RegisterRoutes method if you don't have a favicon located within your site
  • personne3000
    personne3000 over 8 years
    About HttpModule: the method to register the module detailed in the linked article applies to the old Classic IIS pipeline mode, not the (now recommended) integrated mode. See msdn.microsoft.com/library/ms227673(v=vs.100).aspx for details on how to register it if you use integrated mode.
  • Ortund
    Ortund about 5 years
    So where do exceptions get logged to in this case?