Usare IExceptionFilter per loggare le eccezioni.

In un post precedente (vedi qui) ho già introdotto il concetto di ActionFilter e alcune opportunità che ci offre. In questo post vorrei mostrare come realizzarne uno custom per loggare le eccezioni.
Per prima cosa è bene sapere che ogni ActionFilter deve ereditare da FilterAttribute, che è la classe base per tutti i Filter che si utilizzano in ASPNET MVC e, se si vogliono catturare tutti gli errori non gestiti, è necessario implementare anche l’interfaccia IExceptionFilter.

Lo snippet seguente mostra l’implementazione dell’ActionFilter:

public class LoggerFilterAttribute : FilterAttribute, IExceptionFilter {
    readonly ILogger logger;

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.Web.Mvc.FilterAttribute"/> class.
    /// </summary>
    public LoggerFilterAttribute ( ) {
        logger = new Logger()
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.Web.Mvc.FilterAttribute"/> class.
    /// </summary>
    public LoggerFilterAttribute ( ILogger logger ) {
        this.logger = logger;
    }

    /// <summary>
    /// Called when an exception occurs.
    /// </summary>
    /// <param name="context">The filter context.</param>
    public void OnException ( ExceptionContext context ) {
        logger.Error ( context.Exception.Message, context.Exception );

        throw new HttpException(500,context.Exception.Message,context.Exception);
    }
}

A questo punto è sufficiente decorare i nostri Controller, o ancora meglio registrare il Filter come Global per poterlo sfruttare:

[LoggerFilterAttribute()]
public class HomeController : ControllerBase {
  public ActionResunt Index(){
    //DO SOMETHING
  }
}

Ciauz


Comments