非羁押人员管理平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

175 lines
6.6 KiB

using ATS.NonCustodial.Application.Contracts.Interfaces.Logs.OprationLog;
using ATS.NonCustodial.Application.Contracts.Interfaces.Logs.OprationLog.Input;
using ATS.NonCustodial.AuditLogging.AuditLoggings.Services;
using ATS.NonCustodial.Shared.Common.UnifiedResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Diagnostics;
using System.Reflection;
namespace ATS.NonCustodial.AdminUi.Helpers.Logs
{
/// <summary>
/// 控制器操作日志记录 ==> 操作日志处理
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-18 09:46 AM
public class LogHandler : ILogHandler
{
#region Identity
private readonly ILogger _logger;
private readonly ApiHelper _apiHelper;
private readonly IOperationLogService _operationLogService;
private readonly IAuditEventLogger _auditEventLogger;
public LogHandler(
ILogger<LogHandler> logger,
ApiHelper apiHelper,
IOperationLogService operationLogService,
IAuditEventLogger auditEventLogger
)
{
_logger = logger;
_apiHelper = apiHelper;
_operationLogService = operationLogService;
_auditEventLogger = auditEventLogger;
}
#endregion Identity
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var sw = new Stopwatch();
sw.Start();
//调用接口
var actionExecutedContext = await next();
sw.Stop();
try
{
//接口Type
var controllerType = (context.ActionDescriptor as ControllerActionDescriptor)?.ControllerTypeInfo.AsType().GetSummary();
//方法信息
var controllerAction = (context.ActionDescriptor as ControllerActionDescriptor)?.MethodInfo.GetSummary();
var input = new OprationLogAddInput
{
ApiLabel = $"{controllerType}/{controllerAction}".Trim('/'),
ApiMethod = context.HttpContext.Request.Method.ToLower(),
ApiPath = context.ActionDescriptor.AttributeRouteInfo?.Template?.ToLower(),
ElapsedMilliseconds = sw.ElapsedMilliseconds,
Params = JsonConvert.SerializeObject(context.ActionArguments)
};
if (actionExecutedContext.Result is ObjectResult { Value: IResultOutput res })
{
input.Status = res.Success;
input.Msg = res.Msg;
}
#region 设置参数
//switch (context.HttpContext.Request.Method)
//{
// case "GET":
// case "DELETE":
// input.Params = context.HttpContext.Request.Path;
// break;
// case "PUT":
// case "POST":
// context.HttpContext.Request.EnableBuffering();
// context.HttpContext.Request.Body.Position = 0;
// StreamReader reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8);
// input.Params = reader.ReadToEndAsync().GetAwaiter().GetResult();
// context.HttpContext.Request.Body.Position = 0;
// break;
// default: break;
//}
//if (input.Params is { Length: > 1024 })
//{
// input.Params = input.Params.Substring(0, 1021) + "...";
//}
#endregion 设置参数
#region 设置返回值
try
{
if (actionExecutedContext.Exception != null && !actionExecutedContext.ExceptionHandled)
{
input.Exception = actionExecutedContext.Exception.StackTrace;
}
}
catch (Exception ex)
{
input.Exception = ex.StackTrace;
throw;
}
finally
{
if (input.Exception is { Length: > 2048 })
{
input.Exception = input.Exception.Substring(0, 2045) + "...";
}
if (actionExecutedContext != null)
{
input.Result = actionExecutedContext.Result switch
{
ObjectResult objectResult => JsonConvert.SerializeObject(objectResult.Value),
JsonResult jsonResult => JsonConvert.SerializeObject(jsonResult.Value),
ContentResult contentResult => contentResult.Content,
_ => input.Result
};
if (input.Result is { Length: > 2048 })
{
input.Result = input.Result.Substring(0, 2045) + "...";
}
}
}
#endregion 设置返回值
//接口名称
//input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label;
//添加操作日志
await _operationLogService.AddAsync(input);
#region 添加审计日志
//var apiAuditLog = new CustomizedLogEvent()
//{
// Category = nameof(CustomizedLogEvent),
// SubjectType = AuditSubjectTypes.machine,
// SubjectName = Environment.MachineName,
// SubjectIdentifier = Environment.MachineName,
// Action = new { Method = input.ApiPath, Class = context.Controller.ToString() }
//};
//await _auditEventLogger.LogEventAsync(apiAuditLog, options =>
//{
// options.UseDefaultSubject = false;
// options.UseDefaultAction = false;
//});
#endregion 添加审计日志
}
catch (Exception ex)
{
_logger.LogError("操作日志插入异常:{@ex}", ex);
}
}
}
}