5.4 请求审计日志
小知识
Furion
提供了非常强大的 LoggingMonitor
审计日志功能,可直接使用:LoggingMonitor 文档
5.4.1 审计日志
在一个企业应用系统中,用户对系统所有的操作包括请求、数据库操作等等都应该记录起来,那么这些日志我们称为操作日志,也可以说审计日志。
关于数据库操作审计日志
如需实现 sql
操作,数据库操作
的审计日志可查阅 【9.23 审计日志章节】
5.4.2 请求审计日志
实现原理
在这里,结合 【5.3 筛选器】 实现请求审计日志功能。
请求审计日志通常指的是记录请求地址,来源地址,操作人,传递参数等。这个主要是通过 IAsyncActionFilter
筛选器实现,如:
- 定义
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();
// 这里写入日志,或存储到数据库中!!!~~~~~~~~~~~~~~~~~~~~
}
}
}
- 注册
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。