/// <summary> /// 设置异常信息到日志文件和数据库 /// </summary> private void SetExceptionMsg(ActionExecutedContext resultContext, ActionExecutingContext context, LogApiEntity logApiEntity) { if (resultContext.Exception != null) { #region 异常获取 var sbException = new StringBuilder(); var exception = resultContext.Exception; sbException.AppendLine(exception.Message); while (exception.InnerException != null) { sbException.AppendLine(exception.InnerException.Message); exception = exception.InnerException; } sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000)); #endregion logApiEntity.ExecuteResult = sbException.ToString(); logApiEntity.LogStatus = OperateStatusEnum.Fail.ParseToInt(); } else { var result = context.Result as ObjectResult; if (result != null) { logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value); logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); } } }
public async Task <TData <string> > SaveForm(LogApiEntity entity) { TData <string> obj = new TData <string>(); await logApiService.SaveForm(entity); obj.Data = entity.Id.ParseToString(); obj.Tag = 1; return(obj); }
public async Task SaveForm(LogApiEntity entity) { if (entity.Id.IsNullOrZero()) { await entity.Create(); await this.BaseRepository().Insert<LogApiEntity>(entity); } else { await this.BaseRepository().Update<LogApiEntity>(entity); } }
public async Task SaveForm(LogApiEntity entity) { if (entity.Id.IsNullOrZero()) { // 默认赋值 entity.Id = IdGeneratorHelper.Instance.GetId(); ; await _logApiEntityDB.InsertNowAsync(entity); } else { await _logApiEntityDB.UpdateNowAsync(entity, ignoreNullValues : true); } }
/// <summary> /// 保存日志到数据库 /// </summary> private async Task SaveLogAPI(LogApiEntity logApiEntity) { try { logApiEntity.ExecuteParam = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000); logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000); logApiEntity.Id = IdGeneratorHelper.Instance.GetId(); logApiEntity.CreateTime = DateTime.Now; // 踩坑:此处使用三方包进行保存,因为当接口采用自动事务管理时,如果此处也使用EF,会被一并回滚,导致无法正常记录 var logApiDB = App.GetService <ISqlSugarRepository <LogApiEntity> >(); await logApiDB.InsertAsync(logApiEntity); } catch (Exception ex) { LogHelper.Error("日志记录到数据库时发生错误", ex); } }
/// <summary> /// 异步接口日志 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { //先校验header CheckAppSign(context); Stopwatch sw = new Stopwatch(); sw.Start(); var resultContext = await next(); sw.Stop(); string token = context.HttpContext.Request.Query["token"].ParseToString(); #region 保存日志 LogApiEntity logApiEntity = new LogApiEntity(); logApiEntity.ExecuteUrl = context.HttpContext.Request.Path; logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); #region 获取Post参数 switch (context.HttpContext.Request.Method.ToUpper()) { case "GET": logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); break; case "POST": Dictionary <string, string> param = new Dictionary <string, string>(); if (context.HttpContext.Request.HasFormContentType) { foreach (var k in context.HttpContext.Request.Form) { if (!param.ContainsKey(k.Key)) { if (!string.IsNullOrEmpty(k.Value[0])) { param.Add(k.Key, k.Value[0]); } } } } if (param.Count > 0) { logApiEntity.ExecuteUrl += context.HttpContext.Request.QueryString.Value.ParseToString(); logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(param), 4000); } else { logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); } break; } #endregion if (resultContext.Exception != null) { #region 异常获取 StringBuilder sbException = new StringBuilder(); Exception exception = resultContext.Exception; sbException.AppendLine(exception.Message); while (exception.InnerException != null) { sbException.AppendLine(exception.InnerException.Message); exception = exception.InnerException; } sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000)); #endregion logApiEntity.ExecuteResult = sbException.ToString(); logApiEntity.LogStatus = OperateStatusEnum.Fail.ParseToInt(); } else { ObjectResult result = context.Result as ObjectResult; if (result != null) { logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value); logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); } } OperatorInfo user = await Operator.Instance.Current(token); if (user != null) { logApiEntity.BaseCreatorId = user.UserId; } logApiEntity.ExecuteParam = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000); logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000); logApiEntity.ExecuteTime = sw.ElapsedMilliseconds.ParseToInt(); Action taskAction = async() => { // 让底层不用获取HttpContext logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0; await new LogApiBLL().SaveForm(logApiEntity); }; AsyncTaskHelper.StartTask(taskAction); #endregion }
/// <summary> /// 异步接口日志 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Stopwatch sw = new Stopwatch(); sw.Start(); var resultContext = await next(); sw.Stop(); #region 保存日志 LogApiEntity logApiEntity = new LogApiEntity(); logApiEntity.ExecuteUrl = context.HttpContext.Request.Path; logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); #region 获取Post参数 switch (context.HttpContext.Request.Method.ToUpper()) { case "GET": logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); break; case "POST": if (context.ActionArguments?.Count > 0) { logApiEntity.ExecuteUrl += context.HttpContext.Request.QueryString.Value.ParseToString(); logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000); } else { logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); } break; } #endregion if (resultContext.Exception != null) { #region 异常获取 StringBuilder sbException = new StringBuilder(); Exception exception = resultContext.Exception; sbException.AppendLine(exception.Message); while (exception.InnerException != null) { sbException.AppendLine(exception.InnerException.Message); exception = exception.InnerException; } sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000)); #endregion logApiEntity.ExecuteResult = sbException.ToString(); logApiEntity.LogStatus = OperateStatusEnum.Fail.ParseToInt(); } else { ObjectResult result = context.Result as ObjectResult; if (result != null) { logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value); logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); } } logApiEntity.ExecuteParam = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000); logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000); logApiEntity.ExecuteTime = sw.ElapsedMilliseconds.ParseToInt(); Action taskAction = async() => { // 让底层不用获取HttpContext logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0; await new LogApiBLL().SaveForm(logApiEntity); }; AsyncTaskHelper.StartTask(taskAction); #endregion }
/// <summary> /// 异步接口日志 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Stopwatch sw = new Stopwatch(); sw.Start(); string token = context.HttpContext.Request.Headers["ApiToken"].ParseToString(); OperatorInfo user = await Operator.Instance.Current(token); if (user != null) { // 根据传入的Token,设置CustomerId if (context.ActionArguments != null && context.ActionArguments.Count > 0) { PropertyInfo property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("Token"); if (property != null) { property.SetValue(context.ActionArguments.FirstOrDefault().Value, token, null); } switch (context.HttpContext.Request.Method.ToUpper()) { case "GET": break; case "POST": property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("CustomerId"); if (property != null) { property.SetValue(context.ActionArguments.FirstOrDefault().Value, user.UserId, null); } break; } } } var resultContext = await next(); sw.Stop(); #region 保存日志 LogApiEntity logApiEntity = new LogApiEntity(); logApiEntity.ExecuteUrl = context.HttpContext.Request.Path; logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); #region 获取Post参数 switch (context.HttpContext.Request.Method.ToUpper()) { case "GET": logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); break; case "POST": if (context.ActionArguments?.Count > 0) { logApiEntity.ExecuteUrl += context.HttpContext.Request.QueryString.Value.ParseToString(); logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000); } else { logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); } break; } #endregion if (resultContext.Exception != null) { #region 异常获取 StringBuilder sbException = new StringBuilder(); Exception exception = resultContext.Exception; sbException.AppendLine(exception.Message); while (exception.InnerException != null) { sbException.AppendLine(exception.InnerException.Message); exception = exception.InnerException; } sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000)); #endregion logApiEntity.ExecuteResult = sbException.ToString(); logApiEntity.LogStatus = OperateStatusEnum.Fail.ParseToInt(); } else { ObjectResult result = context.Result as ObjectResult; if (result != null) { logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value); logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); } } if (user != null) { logApiEntity.BaseCreatorId = user.UserId; } logApiEntity.ExecuteParam = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000); logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000); logApiEntity.ExecuteTime = sw.ElapsedMilliseconds.ParseToInt(); Action taskAction = async() => { // 让底层不用获取HttpContext logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0; await new LogApiBLL().SaveForm(logApiEntity); }; AsyncTaskHelper.StartTask(taskAction); #endregion }
/// <summary> /// 异步接口日志 /// </summary> public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { bool hasAllowAnonymous = context.ActionDescriptor.EndpointMetadata .Any(em => em.GetType() == typeof(AllowAnonymousAttribute)); //< -- Here it is if (hasAllowAnonymous) { await next(); } else { // 类似计时器 var sw = new Stopwatch(); sw.Start(); // 获取用户信息 var user = await _operator.Current(); if (user == null) { throw new Exception("User not logged in."); } // 更新用户的权限到缓存中 if (user.MenuAuthorizes == null || user.MenuAuthorizes.Count() == 0) { var objMenuAuthorize = await _menuAuthorizeBLL.GetAuthorizeList(user); user.MenuAuthorizes = objMenuAuthorize.Data; _operator.UpdateOperatorInfo(user); } // 校验用户权限 var obj = await CheckAccess(context, user); // 没有权限 if (obj.Tag == 0) { obj.Message = "抱歉,您没有权限"; context.Result = new JsonResult(obj); return; } // 执行 var resultContext = await next(); #region 保存日志 // 如果配置了仅记录报错日志 if (LogAllApi.ToUpper() == "ERROR" && resultContext.Exception == null) { return; } var logApiEntity = new LogApiEntity(); logApiEntity.ExecuteUrl = context.HttpContext.Request.Path; logApiEntity.LogStatus = OperateStatusEnum.Success.ParseToInt(); #region 获取Post参数 switch (context.HttpContext.Request.Method.ToUpper()) { case "GET": logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); break; case "POST": if (context.ActionArguments?.Count > 0) { if (!context.HttpContext.Request.QueryString.HasValue) { break; } logApiEntity.ExecuteUrl += context.HttpContext.Request.QueryString.Value.ParseToString(); logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000); } else { logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString(); } break; } #endregion if (user != null) { logApiEntity.CreatorId = user.UserId; } // 异常信息 SetExceptionMsg(resultContext, context, logApiEntity); // 计时器结束 sw.Stop(); logApiEntity.ExecuteTime = sw.ElapsedMilliseconds.ParseToInt(); logApiEntity.IpAddress = NetHelper.Ip; // 记录日志 await SaveLogAPI(logApiEntity); #endregion } }
public async Task <TData <string> > SaveFormJson([FromForm] LogApiEntity entity) { var obj = await _logApiBLL.SaveForm(entity); return(obj); }