using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using ZhonTai.Common.Output;
using ZhonTai.Plate.Admin.Service.OprationLog;
using ZhonTai.Plate.Admin.Service.OprationLog.Input;
//using Newtonsoft.Json;
namespace ZhonTai.Plate.Admin.HttpApi.Shared.Logs
{
///
/// 操作日志处理
///
public class LogHandler : ILogHandler
{
private readonly ILogger _logger;
private readonly ApiHelper _apiHelper;
private readonly IOprationLogService _oprationLogService;
public LogHandler(
ILogger logger,
ApiHelper apiHelper,
IOprationLogService oprationLogService
)
{
_logger = logger;
_apiHelper = apiHelper;
_oprationLogService = oprationLogService;
}
public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var sw = new Stopwatch();
sw.Start();
var actionExecutedContext = await next();
sw.Stop();
//操作参数
//var args = JsonConvert.SerializeObject(context.ActionArguments);
//操作结果
//var result = JsonConvert.SerializeObject(actionResult?.Value);
try
{
var input = new OprationLogAddInput
{
ApiMethod = context.HttpContext.Request.Method.ToLower(),
ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(),
ElapsedMilliseconds = sw.ElapsedMilliseconds
};
if (actionExecutedContext.Result is ObjectResult result && result.Value is IResponseOutput res)
{
input.Status = res.Success;
input.Msg = res.Msg;
}
input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label;
await _oprationLogService.AddAsync(input);
}
catch (Exception ex)
{
_logger.LogError("操作日志插入异常:{@ex}", ex);
}
}
}
}