⭐️ Furion v4 版本支持【所有历史版本】无缝升级,一套代码兼容 .NET 5+ ⭐️
Skip to main content

5.4 请求审计日志

5.4.1 审计日志

在一个企业应用系统中,用户对系统所有的操作包括请求、数据库操作等等都应该记录起来,那么这些日志我们称为操作日志,也可以说审计日志。

关于数据库操作审计日志

如需实现 sql 操作,数据库操作 的审计日志可查阅 【9.22 审计日志章节

5.4.2 请求审计日志

实现原理

在这里,结合 【5.3 筛选器】 实现请求审计日志功能。

请求审计日志通常指的是记录请求地址,来源地址,操作人,传递参数等。这个主要是通过 IAsyncActionFilter 筛选器实现,如:

  1. 定义 RequestAuditFilter 并实现 IAsyncActionFilter
using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc.Filters;using System;using System.Security.Claims;using System.Threading.Tasks;namespace Furion.Web.Core{    public class RequestAuditFilter : IAsyncActionFilter    {        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)        {            //============== 这里是执行方法之前获取数据 ====================            // 获取控制器、路由信息            var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;            // 获取请求的方法            var method = actionDescriptor.MethodInfo;            // 获取 HttpContext 和 HttpRequest 对象            var httpContext = context.HttpContext;            var httpRequest = httpContext.Request;            // 获取客户端 Ipv4 地址            var remoteIPv4 = httpContext.GetRemoteIpAddressToIPv4();            // 获取请求的 Url 地址            var requestUrl = httpRequest.GetRequestUrlAddress();            // 获取来源 Url 地址            var refererUrl = httpRequest.GetRefererUrlAddress();            // 获取请求参数(写入日志,需序列化成字符串后存储)            var parameters = context.ActionArguments;            // 获取操作人(必须授权访问才有值)"userId" 为你存储的 claims type,jwt 授权对应的是 payload 中存储的键名            var userId = httpContext.User?.FindFirstValue("userId");            // 请求时间            var requestedTime = DateTimeOffset.Now;            //============== 这里是执行方法之后获取数据 ====================            var actionContext = await next();            // 获取返回的结果            var returnResult = actionContext.Result;            // 判断是否请求成功,没有异常就是请求成功            var isRequestSucceed = actionContext.Exception == null;            // 获取调用堆栈信息,提供更加简单明了的调用和异常堆栈            var stackTrace = EnhancedStackTrace.Current();            // 这里写入日志,或存储到数据库中!!!~~~~~~~~~~~~~~~~~~~~        }    }}
  1. 注册 RequestAuditFilter 筛选器
services.AddMvcFilter<RequestAuditFilter>();

5.4.3 LoggingMonitor 审计日志

小知识

Furion 提供了非常强大的 LoggingMonitor 审计日志功能,可直接使用:LoggingMonitor 文档

┏━━━━━━━━━━━  Logging Monitor ━━━━━━━━━━━┣ Furion.Application.TestLoggerServices.GetPerson (Furion.Application)┣ 控制器名称:              TestLoggerServices┣ 操作名称:                GetPerson┣ 路由信息:                [area]: ; [controller]: test-logger; [action]: person┣ 请求方式:                POST┣ 请求地址:                https://localhost:44316/api/test-logger/person/11┣ 来源地址:                https://localhost:44316/api/index.html┣ 浏览器标识:              Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62┣ 客户端 IP 地址:          0.0.0.1┣ 服务端 IP 地址:          0.0.0.1┣ 服务端运行环境:          Development┣ 执行耗时:                31ms┣ ━━━━━━━━━━━━━━━  授权信息 ━━━━━━━━━━━━━━━┣ JWT Token:               Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEsIkFjY291bnQiOiJhZG1pbiIsImlhdCI6MTY1ODcxNjc5NywibmJmIjoxNjU4NzE2Nzk3LCJleHAiOjE2NTg3MTc5OTcsImlzcyI6ImRvdG5ldGNoaW5hIiwiYXVkIjoicG93ZXJieSBGdXJpb24ifQ.VYZkwwqCwlUy3aJjuL-og62I0rkxNQ96kSjEm3VgXtg┣ UserId (integer)1┣ Account (string):        admin┣ iat (integer)1658716797┣ nbf (integer)1658716797┣ exp (integer)1658717997┣ iss (string):            dotnetchina┣ aud (string):            powerby Furion┣ ━━━━━━━━━━━━━━━  参数列表 ━━━━━━━━━━━━━━━┣ Content-Type:id (Int32)11┣ ━━━━━━━━━━━━━━━  返回信息 ━━━━━━━━━━━━━━━┣ 类型:                    Furion.Application.Persons.PersonDto┣ 返回值:                  {"Id":11,"Name":null,"Age":0,"Address":null,"PhoneNumber":null,"QQ":null,"CreatedTime":"0001-01-01T00:00:00+00:00","Childrens":null,"Posts":null}┗━━━━━━━━━━━  Logging Monitor ━━━━━━━━━━━

5.4.4 反馈与建议

与我们交流

给 Furion 提 Issue

演练场