审计日志 #

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

关于数据库操作审计日志

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

请求审计日志 #

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

  1. 定义 RequestAuditFilter 并实现 IAsyncActionFilter
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Security.Claims;
using System.Threading.Tasks;

namespace Mall3s.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>();

LoggingMonitor 审计日志 #

小知识

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

┏━━━━━━━━━━━  Logging Monitor ━━━━━━━━━━━
┣ Mall3s.Application.TestLoggerServices.GetPerson (Mall3s.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 Mall3s
┣ ━━━━━━━━━━━━━━━  参数列表 ━━━━━━━━━━━━━━━
┣ Content-Type:
┣
┣ id (Int32)11
┣ ━━━━━━━━━━━━━━━  返回信息 ━━━━━━━━━━━━━━━
┣ 类型:                    Mall3s.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 ━━━━━━━━━━━