
Log exception aspect, bir web uygulamasında hata (exception) yakalama ve kaydetme (logging) işlemlerinin merkezi bir noktadan yönetilmesini sağlayan bir tasarım kalıbıdır.
Log exception aspect, Aspect Oriented Programming (AOP) ile uygulanabilir. AOP, kesişen ilgiler (cross cutting concerns) olarak adlandırılan, uygulamanın farklı katmanlarında ortak olarak kullanılan işlemlerin merkezi bir noktadan yönetilmesini sağlayan bir programlama paradigmasıdır.
Log exception aspect, AOP’nin bir uygulaması olarak, hata yakalama ve kaydetme işlemlerini yönetir. Örneğin, bir web sitesinde yapılan her işlemde oluşabilecek hataları yakalamak, bunları log dosyasına veya veritabanına kaydetmek, hata seviyesine göre farklı aksiyonlar almak gibi işlemler log exception aspect ile gerçekleştirilebilir.
Log exception aspect, genellikle web uygulamalarının başlatılması sırasında veya belirli metotların çağrılması sırasında devreye girer.
Log exception aspect, Interceptor adı verilen yapılarla uygulanabilir. Interceptor, metot çağrımları sırasında araya girerek kesişen ilgileri işletmemizi ve yönetmemizi sağlamaktadır.
public class LogExceptionAspect : MethodInterception { private readonly LoggerServiceBase? _loggerServiceBase; public LogExceptionAspect(Type loggerService) { if (loggerService.BaseType != typeof(LoggerServiceBase)) { throw new System.Exception(AspectMessages.WrongLoggerType); } _loggerServiceBase = (LoggerServiceBase)Activator.CreateInstance(loggerService)!; } protected override void OnException(IInvocation invocation, System.Exception e) { LogDetailException logDetailException = GetLogDetail(invocation); logDetailException.ExceptionMessage = e.Message; _loggerServiceBase!.Error(logDetailException); } private LogDetailException GetLogDetail(IInvocation invocation) { var logParameters = new List<LogParameter>(); for (int i = 0; i < invocation.Arguments.Length; i++) { logParameters.Add(new LogParameter { Name = invocation.GetConcreteMethod().GetParameters()[i].Name, Value = invocation.Arguments[i], Type = invocation.Arguments[i].GetType().Name }); } var logDetailException = new LogDetailException { MethodName = invocation.Method.Name, ServiceName = invocation.Method.DeclaringType == null ? "" : invocation.Method.DeclaringType.FullName, LogParameters = logParameters }; return logDetailException; } }