diff --git a/Core/Eisk.Core/Eisk.Core.csproj b/Core/Eisk.Core/Eisk.Core.csproj index efe49ef..b5649bb 100644 --- a/Core/Eisk.Core/Eisk.Core.csproj +++ b/Core/Eisk.Core/Eisk.Core.csproj @@ -5,6 +5,7 @@ + diff --git a/Core/Eisk.Core/Exceptions/GlobalExceptionHandler.cs b/Core/Eisk.Core/Exceptions/GlobalExceptionHandler.cs new file mode 100644 index 0000000..e96cc39 --- /dev/null +++ b/Core/Eisk.Core/Exceptions/GlobalExceptionHandler.cs @@ -0,0 +1,48 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Eisk.Core.Logger; +using Eisk.Domains.Entities; + +namespace Eisk.Core.Exceptions +{ + public class GlobalExceptionHandler + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public GlobalExceptionHandler(RequestDelegate next, ILogger logger) + { + this._next = next; + this._logger = logger; + } + + public async Task InvokeAsync(HttpContext httpContext) + { + try + { + await _next(httpContext); + } + catch(Exception exception) + { + _logger.Error($"Error in processing request: {exception}"); + await HandleExceptionAsync(httpContext, exception); + } + } + + private Task HandleExceptionAsync(HttpContext context, Exception exception) + { + context.Response.ContentType = "application/json"; + context.Response.StatusCode = (int) HttpStatusCode.InternalServerError; + + return context.Response.WriteAsync(new ErrorDetails() + { + ErrorCode = context.Response.StatusCode, + ErrorMessage = exception.Message + }.ToString()); + } + + + } +} diff --git a/Core/Eisk.Core/Logger/Logger.cs b/Core/Eisk.Core/Logger/Logger.cs new file mode 100644 index 0000000..f33fac8 --- /dev/null +++ b/Core/Eisk.Core/Logger/Logger.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using log4net; + +namespace Eisk.Core.Logger +{ + //wrapper for logger class + public interface ILogger + { + void Info(string message); + void Warn(string message); + void Debug(string message); + void Error(string message); + } + + /// + /// Responsible for global logging + /// + public class Logger : ILogger + { + private ILog _logger; + + public Logger() + { + this._logger = LogManager.GetLogger(Assembly.GetCallingAssembly(), "logger"); + } + + public Logger(Type logClass) + { + this._logger = LogManager.GetLogger(logClass); + } + + public void Debug(string message) + { + _logger.Debug(message); + } + + public void Error(string message) + { + _logger.Error(message); + } + + public void Info(string message) + { + _logger.Info(message); + } + + public void Warn(string message) + { + _logger.Warn(message); + } + } +} + diff --git a/DomainCore/Eisk.Domains/Entities/ErrorDetails.cs b/DomainCore/Eisk.Domains/Entities/ErrorDetails.cs new file mode 100644 index 0000000..c76b6e9 --- /dev/null +++ b/DomainCore/Eisk.Domains/Entities/ErrorDetails.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; + +namespace Eisk.Domains.Entities +{ + public class ErrorDetails + { + public int ErrorCode { get; set; } + public string ErrorMessage { get; set; } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } + } +} diff --git a/WebApi/Eisk.WebApi/Controllers/EmployeesController.cs b/WebApi/Eisk.WebApi/Controllers/EmployeesController.cs index 86de726..a51eca2 100644 --- a/WebApi/Eisk.WebApi/Controllers/EmployeesController.cs +++ b/WebApi/Eisk.WebApi/Controllers/EmployeesController.cs @@ -8,7 +8,7 @@ public class EmployeesController : WebApiControllerBase { public EmployeesController(EmployeeDomainService employeeDomainService):base(employeeDomainService) { - + throw new System.Exception("test"); } } } diff --git a/WebApi/Eisk.WebApi/Eisk.WebApi.csproj b/WebApi/Eisk.WebApi/Eisk.WebApi.csproj index 1472bda..4e9ccf9 100644 --- a/WebApi/Eisk.WebApi/Eisk.WebApi.csproj +++ b/WebApi/Eisk.WebApi/Eisk.WebApi.csproj @@ -12,6 +12,7 @@ + diff --git a/WebApi/Eisk.WebApi/Program.cs b/WebApi/Eisk.WebApi/Program.cs index baf704e..ab4c136 100644 --- a/WebApi/Eisk.WebApi/Program.cs +++ b/WebApi/Eisk.WebApi/Program.cs @@ -1,5 +1,9 @@ -using Microsoft.AspNetCore; +using System.Reflection; +using System.IO; +using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; +using log4net; +using log4net.Config; namespace Eisk.WebApi { @@ -7,6 +11,9 @@ public class Program { public static void Main(string[] args) { + var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); + XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); + BuildWebHost(args).Run(); } diff --git a/WebApi/Eisk.WebApi/Startup.cs b/WebApi/Eisk.WebApi/Startup.cs index be94df9..050e8cd 100644 --- a/WebApi/Eisk.WebApi/Startup.cs +++ b/WebApi/Eisk.WebApi/Startup.cs @@ -15,6 +15,8 @@ namespace Eisk.WebApi using DataServices.Interfaces; using DomainServices; using EFCore.Setup; + using Eisk.Core.Exceptions; + using Eisk.Core.Logger; public class Startup { @@ -46,6 +48,9 @@ public void ConfigureServices(IServiceCollection services) services.AddTransient(); + //Logging service + services.AddSingleton(); + services.AddMvc(); // Register the Swagger generator, defining 1 or more Swagger documents @@ -77,6 +82,9 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) app.UseDeveloperExceptionPage(); } + //global exception middleware + app.UseMiddleware(); + // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(); diff --git a/WebApi/Eisk.WebApi/log4net.config b/WebApi/Eisk.WebApi/log4net.config new file mode 100644 index 0000000..808e44f --- /dev/null +++ b/WebApi/Eisk.WebApi/log4net.config @@ -0,0 +1,19 @@ + + +
+ + + + + + + + + + + + + + + + \ No newline at end of file