zoukankan      html  css  js  c++  java
  • .NetCore中使用ExceptionLess 添加操作日志

    上一篇文章已经扩展了日志,下面我们在结合下处理操作日志

    通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 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中的日志

  • 相关阅读:
    react 高阶组件之小学版
    react diff 极简版
    react 16更新
    react 组件的生命周期 超简版
    JS继承(简单理解版)
    Vue Virtual Dom 和 Diff原理(面试必备) 极简版
    Vue数据双向绑定(面试必备) 极简版
    Vue生命周期的执行过程(面试必备) 极简版
    多个Portal for ArcGIS 间的协作实操
    Portal的安全代理(反向代理出口)配置架构
  • 原文地址:https://www.cnblogs.com/liyouming/p/9809483.html
Copyright © 2011-2022 走看看