Logging to multiple ELMAH logs

Unfortunately, ELMAH (the open source project) doesn't support multiple log targets like other logging frameworks like Serilog. This makes logging to multiple logs a bit tricky but in no way impossible. Let's say that you're using ELMAH in your web application and configured it to log everything in SQL Server. If you look through your web.config file, you will have code looking like this somewhere:

<elmah>
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah"/>
</elmah>

As you probably know, this tells ELMAH to log all unhandled errors in SQL Server with the connection string “elmah”. You cannot add more <errorLog> elements, why logging into a second log seems impossible. Meet ELMAH's Logged event, which is a great hook to log to multiple targets. Install the Elmah.Io NuGet package and add the following code to your global.asax.cs file:

void ErrorLog_Logged(object sender, Elmah.ErrorLoggedEventArgs args)
{
    var elmahIoLog = new Elmah.Io.ErrorLog(ElmahioAPI.Create("API_KEY"), new Guid("LOG_ID"));
    elmahIoLog.Log(args.Entry.Error);
}

In the above code, we listen for the Logged event by simply declaring a method named ErrorLog_Logged. When called, we create a new (Elmah.Io.)ErrorLog instance with an IElmahioAPI object and the log ID. Remember to replace API_KEY with your API key (Where is my API key?) and LOG_ID with your log ID (Where is my log ID?). You may want to share the ElmahioAPI object between requests by declaring it as a private member. Next, we simply call the Log method with a new Error object. Bam! The error is logged both in SQL Server and in elmah.io.

If you only want to log certain types of errors in elmah.io, but everything to your normal log, you can extend your code like this:

void ErrorLog_Logged(object sender, Elmah.ErrorLoggedEventArgs args)
{
    if (args.Entry.Error.StatusCode == 500)
    {
        var elmahIoLog = new Elmah.Io.ErrorLog(/*...*/);
        elmahIoLog.Log(args.Entry.Error);
    }
}

This time we only begin logging to elmah.io, if the thrown exception is of type HttpException and contains an HTTP status code of 500. This example only logs errors with status code 500 in elmah.io and all errors in your normal error log. If you want to create this filter on all logs, you should use the ErrorLog_Filtering method instead. This method is called before ErrorLog_Logged and before actually logging the error to your normal error log.


This article was brought to you by the elmah.io team. elmah.io is the best error management system for .NET web applications. We monitor your website, alert you when errors start happening, and help you fix errors fast.

See how we can help you monitor your website for crashes Monitor your website