using JiepeiWMS.Common.LogHelper; using JiepeiWMS.Hubs; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using StackExchange.Profiling; using System; namespace JiepeiWMS.Filter { /// /// 全局异常错误日志 /// public class GlobalExceptionsFilter : IExceptionFilter { private readonly IWebHostEnvironment _env; private readonly IHubContext _hubContext; private readonly ILogger _loggerHelper; public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger loggerHelper, IHubContext hubContext) { _env = env; _loggerHelper = loggerHelper; _hubContext = hubContext; } public void OnException(ExceptionContext context) { var json = new JsonErrorResponse(); json.Message = context.Exception.Message;//错误信息 var errorAudit = "Unable to resolve service for"; if (!string.IsNullOrEmpty(json.Message)&& json.Message.Contains(errorAudit)) { json.Message = json.Message.Replace(errorAudit, $"(若新添加服务,需要重新编译项目){errorAudit}"); } if (_env.IsDevelopment()) { json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息 } context.Result = new InternalServerErrorObjectResult(json); MiniProfiler.Current.CustomTiming("Errors:", json.Message); //采用log4net 进行错误日志记录 _loggerHelper.LogError(json.Message + WriteLog(json.Message, context.Exception)); _hubContext.Clients.All.SendAsync("ReceiveUpdate", LogLock.GetLogData()).Wait(); } /// /// 自定义返回格式 /// /// /// /// public string WriteLog(string throwMsg, Exception ex) { return string.Format("\r\n【自定义错误】:{0} \r\n【异常类型】:{1} \r\n【异常信息】:{2} \r\n【堆栈调用】:{3}", new object[] { throwMsg, ex.GetType().Name, ex.Message, ex.StackTrace }); } } public class InternalServerErrorObjectResult : ObjectResult { public InternalServerErrorObjectResult(object value) : base(value) { StatusCode = StatusCodes.Status500InternalServerError; } } //返回错误信息 public class JsonErrorResponse { /// /// 生产环境的消息 /// public string Message { get; set; } /// /// 开发环境的消息 /// public string DevelopmentMessage { get; set; } } }