上一篇文章已經擴展了日志,下面我們在結合下處理操作日志
通常我們想到操作日志 可能想到的參數可能有 模塊 方法 參數內容 操作人 操作時間 操作 Ip 下面我們就來結合這些信息添加操作日志
如果要在代碼中每個操作中添加 是非常繁瑣的 代碼很大部分重復,有AOP思想的應該都知道面向切面的方式處理日志,日志貫穿整個系統
所以我們會想到過濾器,在之前的文章中我用到了攔截器處理,這里我們使用 Filter 過濾器 結合Attribute屬性來處理,這里我們主要依靠 IAsyncActionFilter 或者 IActionFilter 來處理
定義個屬性類 LogAttribute
public class LogAttribute : Attribute, IAsyncActionFilter { }
實現 IAsyncActionFilter 接口 ,定義好屬性需要的構造函數 具體代碼如下 結合 ExceptionLess添加操作日志
public class LogAttribute : Attribute, IAsyncActionFilter { private string MoudleName { get; set; } private string MethodName { get; set; } /// <summary> /// 構造日志類型 /// </summary> /// <param name="Moudle">模塊名稱</param> /// <param name="Method">方法名稱</param> public LogAttribute(string Moudle, string Method) { this.MoudleName = Moudle; this.MethodName = Method; } /// <summary> /// 添加操作日志 liyouming /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var actiondescriptor = ((ControllerActionDescriptor)context.ActionDescriptor); var identity = ((ApiBase)context.Controller).userIdentity; var _eLLog = context.HttpContext.RequestServices.GetService(typeof(IELLog)) as IELLog; var model = JsonConvert.SerializeObject(context.ActionArguments); _eLLog.AddSource($"[{MoudleName}]{MethodName}{string.Format("{0:yyyy年MM月dd日 HH:mm:ss}", DateTime.Now)}") .AddMessage("參數內容:" + model ?? "") .AddTag(identity.UserId ?? "") .AddTag(identity.UserName ?? "") .AddTag(actiondescriptor.ControllerName) .AddTag(actiondescriptor.ActionName) .AddTag(MoudleName) .AddTag(MethodName) .AddTag(string.Format("{0:yyyy-MM-dd}", DateTime.Now)) .AddSubmitInfo(); await next.Invoke(); } }
接下來添加好接口代碼
/// <summary> /// Demo 添加數據 調用MediatR DDD 實現領域事件 /// </summary> /// <returns></returns> [HttpPost] [Route("createdata")] [ProducesResponseType(typeof(OperatorResult),(int) HttpStatusCode.OK)] [Permission(PermissionCode.DemoCreate)] [Log("測試模塊","添加測試方法")] public async Task<IActionResult> CreateData([FromBody]SchoolDto model) { var validationResult = _validator.Validate(model); if (!validationResult.IsValid) { return Ok(new OperatorResult { Result = ResultType.Fail, Message = string.Join(";", validationResult.Errors) }); } //這里用Mapper做映射 var school = _mapper.Map<SchoolDto, School>(model); school.Id = Guid.NewGuid(); school.AddClassesDomain(new Classes { CName="Demo", Id=Guid.NewGuid() }); var command = new DemoCreateCommand { com_school = school }; var result = await _mediator.Send(command); return Ok(result); }
下面我們通過API來測試下

下面看下ExceptionLess中的日志


