.NetCore日志异步实现实例

.NetCore⽇志异步实现实例
前⾔:
  近⽇在项⽬协同开发过程中出现了问题,数据出现了异常;其他⼈员怀疑项⽬数据丢失程序存在问题。于是通过排查程序提供的审计⽇志最终还原了当时操作及原因。
  可见审计⽇志在排查、定位问题是相当有⽤的,那么在.Net Core 如何来实现审计⽇志呢?
  接下来⼀步步来实现效果
⼀、审计⽇志定义及作⽤
 审计⽇志: 
: “审计跟踪(也叫审计⽇志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序列的⽂档证据,这些活动序列可以在任何时间影响⼀个特定的操作,步骤或其他”
 作⽤:
  1、快速定位问题耗时及性能情况
  2、记录调⽤时环境信息:如浏览器、参数等
⼆、.Net Core 中实现审计⽇志
 那么怎么实现审计⽇志呢?其实核⼼思想很简单。包含以下步骤:
获取调⽤接⼝⽅法时相关信息
记录当前接⼝耗时情况
保存审计⽇志信息到数据库中
  那么如何获取调⽤接⼝时相关信息呢?.Net Core中可以使⽤:过滤器、实现。 
  本次⽰例中将采⽤过滤器实现审计⽇志实现功能;主要流程如下
定义审计⽇志信息: 
public class AuditInfo
{
/
// <summary>
/// 调⽤参数
/// </summary>
public string Parameters { get; set; }
/// <summary>
/// 浏览器信息
/// </summary>
public string BrowserInfo { get; set; }
/// <summary>
/// 客户端信息
/// </summary>
public string ClientName { get; set; }
/// <summary>
压片机模具
/// 客户端IP地址
/// </summary>
public string ClientIpAddress { get; set; }
/// <summary>
/// 执⾏耗时
/// </summary>
public int ExecutionDuration { get; set; }
/// <summary>
/// 执⾏时间
/
// </summary>
public DateTime ExecutionTime { get; set; }
/// <summary>
/// 返回内容
/// </summary>
public string ReturnValue { get; set; }
/// <summary>
/// 异常对象
/// </summary>
public Exception Exception { get; set; }
/// <summary>
/
// ⽅法名
/// </summary>
public string MethodName { get; set; }
/// <summary>
/// 服务名
/// </summary>
public string ServiceName { get; set; }
/// <summary>
/// 调⽤者信息
/// </summary>
public string UserInfo { get; set; }
/
// <summary>
/// ⾃定义数据
/// </summary>
public string CustomData { get; set; }
}
实现审计⽇志过滤器
using AuditLogDemo.Models;
using AuditLogDemo.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace AuditLogDemo.Fliters
{
public class AuditLogActionFilter : IAsyncActionFilter
{
/// <summary>
/// 审计⽇志服务对象
/// </summary>
private readonly IAuditLogService _auditLogService;
/// <summary>
/// 登录⽤户
/// </summary>
private readonly ISession _Session;
/// <summary>
/
// ⽇志记录
/// </summary>
private readonly ILogger<AuditLogActionFilter> _logger;
public AuditLogActionFilter(爆破片
IAuditLogService auditLogService,
ISession Session,
ILogger<AuditLogActionFilter> logger
)
{
_Session = Session;
_logger = logger;
_auditLogService = auditLogService;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)        {
// 判断是否写⽇志
if (!ShouldSaveAudit(context))
{
await next();
return;
}
//接⼝Type
var type = (context.ActionDescriptor as ControllerActionDescriptor).ControllerTypeInfo.AsType();
//⽅法信息
var method = (context.ActionDescriptor as ControllerActionDescriptor).MethodInfo;
//⽅法参数
var arguments = context.ActionArguments;
//开始计时
var stopwatch = Stopwatch.StartNew();
var auditInfo = new AuditInfo
{
UserInfo = _Session?.Id,
ServiceName = type != null ? type.FullName.TruncateWithPostfix(EntityDefault.FieldsLength250) : "",                MethodName = method.Name.TruncateWithPostfix(EntityDefault.FieldsLength250),
////请求参数转Json
Parameters = JsonConvert.SerializeObject(arguments),
ExecutionTime = DateTime.Now,
BrowserInfo = context.HttpContext.Request.Headers["User-Agent"].ToString().TruncateWithPostfix(EntityDefault.FieldsLength250),                ClientIpAddress = context.HttpContext.Connection.RemoteIpAddress.ToString().TruncateWithPostfix(EntityDefault.FieldsLength50),                //ClientName = _clientInfoProvider.ComputerName.TruncateWithPostfix(EntityDefault.FieldsLength100),
Id = Guid.NewGuid().ToString()
};
ActionExecutedContext result = null;
try
{
result = await next();
if (result.Exception != null && !result.ExceptionHandled)
{
auditInfo.Exception = result.Exception;
}
}
catch (Exception ex)
{tvline
auditInfo.Exception = ex;
throw;
}
finally
{
stopwatch.Stop();
auditInfo.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds);
if (result != null)
{
switch (result.Result)
{
case ObjectResult objectResult:
auditInfo.ReturnValue = JsonConvert.SerializeObject(objectResult.Value);
break;
case JsonResult jsonResult:
auditInfo.ReturnValue = JsonConvert.SerializeObject(jsonResult.Value);
防静电水磨石break;
case ContentResult contentResult:
auditInfo.ReturnValue = contentResult.Content;
break;
}
}
Console.WriteLine(auditInfo.ToString());
//保存审计⽇志
await _auditLogService.SaveAsync(auditInfo);
}
}
/// <summary>
/// 是否需要记录审计
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private bool ShouldSaveAudit(ActionExecutingContext context)
{
if (!(context.ActionDescriptor is ControllerActionDescriptor))
return false;锰氧化物
var methodInfo = (context.ActionDescriptor as ControllerActionDescriptor).MethodInfo;
if (methodInfo == null)
{
return false;
}
if (!methodInfo.IsPublic)
冷光源uv机{
return false;
}
if (methodInfo.GetCustomAttribute<AuditedAttribute>() != null)
{
return true;
}
if (methodInfo.GetCustomAttribute<DisableAuditingAttribute>() != null)
{
return false;
}
var classType = methodInfo.DeclaringType;
if (classType != null)
{
if (classType.GetTypeInfo().GetCustomAttribute<AuditedAttribute>() != null)
{
return true;
}
if (classType.GetTypeInfo().GetCustomAttribute<AuditedAttribute>() != null)
{
return false;
}
}
return false;
}
}
}
   该内容为实现审计⽇志功能主要逻辑,通过过滤器获取当前执⾏控制器、⽅法判断是否需要记录审计⽇志;其他请求参数、客户端ip 等相关基本信息组成审计⽇志对象,并记录调⽤时间。 
注册过滤器
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.Filters.Add(typeof(AuditLogActionFilter));
});
//审计⽇志存储
services.AddDbContext<AuditLogDBContent>(options =>
{
string conn = Configuration.GetConnectionString("LogDB");
options.UseSqlite(conn);
});
}
  到此审计⽇志主要逻辑已经实现完成。是不是很简单
三、总结
 回过头来看,在 core 中需要统⼀监控或过滤时,可以采⽤过滤器(Filter)或来实现相关效果
 .Net Core中 Filter 常件的有:Authorization Filter(认证过滤器),Resource Filter(资源过滤器),Exception Filter(异常过滤
器),Action Filter(⽅法过滤器),Result Filter(结果过滤器)

本文发布于:2024-09-22 03:45:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/143627.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:审计   实现   记录   过滤器   信息   相关   问题   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议