1. 程式人生 > >.NetCore中使用ExceptionLess 新增操作日誌

.NetCore中使用ExceptionLess 新增操作日誌

上一篇文章已經擴充套件了日誌,下面我們在結合下處理操作日誌

通常我們想到操作日誌 可能想到的引數可能有 模組 方法 引數內容 操作人 操作時間 操作 Ip 下面我們就來結合這些資訊新增操作日誌

如果要在程式碼中每個操作中新增 是非常繁瑣的 程式碼很大部分重複,有AOP思想的應該都知道面向切面的方式處理日誌,日誌貫穿整個系統

所以我們會想到過濾器,在之前的文章中我用到了攔截器處理,這裡我們使用 Filter 過濾器 結合Attribute屬性來處理,這裡我們主要依靠 IAsyncActionFilter 來處理

定義個屬性類 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() });
            string content = JsonConvert.SerializeObject(school);
            var command = new DemoCreateCommand { com_school = school };
            var result = await _mediator.Send(command);
            
            return Ok(result);
        }

 

下面我們通過API來測試下

下面看下ExceptionLess中的日誌