Skip to content

5.4 请求审计日志

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

5.4.1 审计日志

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

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

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