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