Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override Elmah logged error message

Is there any way of overriding the error message logged by Elmah without duplicating it?

I have a custom exception class:

public class BusinessException : Exception
{
    // detailed error message used for logging / debugging
    public string InternalErrorMessage { get; set; }

    public BusinessException(string message, string internalMessage)
        :base(message)
    {
        InternalErrorMessage = internalMessage;
    }
}

From the code, i throw an exception like this:

string detailedErrorMessage = string.Format("User {0} does not have permissions to access CreateProduct resource", User.Identity.Name);
throw new BusinessException("Permission denied", detailedErrorMessage);

When Elmah logs the error, it only logs Permission denied message. However, i need to log the InternalErrorMessage property of the exception instead.

I've tried to create a custom HandleErrorAttribute to do this, but this duplicates the exceptions logged:

public class ErrorHandleAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled == true)
            return;

        Exception exception = filterContext.Exception;

        BusinessException businessException = exception as BusinessException;
        if (businessException != null)
        {
            ErrorSignal.FromCurrentContext().Raise(new Exception(businessException.InternalErrorMessage, exception));
        }
    }
}

enter image description here

like image 657
Catalin Avatar asked Dec 02 '25 06:12

Catalin


1 Answers

I think your issue might be here:

    if (businessException != null) {
        ErrorSignal.FromCurrentContext().Raise(
            new Exception(businessException.InternalErrorMessage, exception));
    }

When you create a new exception rather than something like this:

    if (businessException != null) {
        ErrorSignal.FromCurrentContext().Raise(businessException));
    }

I have this done the code for one of my sites and can see if I can recreate your issue later today (assuming this does not work). I think this is the SO post that helped me implement: How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?

Edit:

Re-reading your question and the other answer I realize I was trying to solve your attempted correction and not the actual problem. Have you tried something like this solution which is only a slight deviation from your current attempt:

public override void OnException(ExceptionContext filterContext) {
    if (filterContext.ExceptionHandled == true) {
        return;
    }
    Exception exception = filterContext.Exception;

    BusinessException businessException = exception as BusinessException;
    if (businessException != null) {
        var customEx = new Exception(
            businessException.InternalErrorMessage, new BusinessException());
        ErrorSignal.FromCurrentContext().Raise(customEx);
        return;
    }
}

Check that the InternalErrormessage is returning what you expect, and I expect that forcing a return here will prevent the exception from being logged twice. Otherwise it is essentially what you had done.

like image 185
Matthew Avatar answered Dec 03 '25 21:12

Matthew



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!