using System.Diagnostics;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
namespace MESApplication;
///
/// 方法过滤器
///
public class ActionFilter : IActionFilter
{
private Stopwatch _stopwatch;
///
/// 监控日志
///
public static ILogger LoggerMonitor { get; set; }
///
/// 错误日志
///
public static ILogger LoggerError { get; set; }
///
/// 方法执行前
///
///
///
public async void OnActionExecuting(ActionExecutingContext context)
{
// ErrorLog.Write("==================================================================================================================================");
_stopwatch = new Stopwatch();
_stopwatch.Start();
//throw new NotImplementedException();
if (LoggerMonitor != null)
{
//记录请求参数日志
var desc = context.ActionDescriptor as ControllerActionDescriptor;
if (desc != null)
{
var headers = new Dictionary();
var requestHeaders = context.HttpContext.Request.Headers;
// 访问请求中的 header 信息
foreach (var header in requestHeaders)
headers.Add(header.Key, header.Value);
var requestHead = JsonConvert.SerializeObject(headers);
var bodys = new Dictionary();
var actionArguments = context.ActionArguments;
// 访问请求中的参数
foreach (var argument in actionArguments)
{
//dic.Add(argument.Key, argument.Value);
var parameter =
JsonConvert
.DeserializeObject>(
argument.Value.ToString());
foreach (var item in parameter)
bodys.Add(item.Key, item.Value);
}
var requestBody = JsonConvert.SerializeObject(bodys);
var logText = CreateRequestLogText(
context.HttpContext.Request.Method, desc.ControllerName,
desc.ActionName, requestHead, requestBody);
//LoggerMonitor.LogDebug(logText);
//ErrorLog.Write(logText);
}
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
//throw new NotImplementedException();
_stopwatch.Stop();
var elaspsedMillisedconds = _stopwatch.ElapsedMilliseconds;
var msg = "";
//string msg = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 接口执行时间:{elaspsedMillisedconds}毫秒";
//ErrorLog.Write(msg);
if (context.Exception != null)
// 记录异常日志
if (LoggerError != null)
{
LoggerError.LogError(context.Exception,
context.Exception.Message);
ErrorLog.Write(
$@"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 接口异常:{JsonConvert.SerializeObject(context.Exception)}");
ErrorLog.Write(
$@"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 异常提示信息:{JsonConvert.SerializeObject(context.Exception.Message)}");
ErrorLog.Write(
"==================================================================================================================================");
}
if (LoggerMonitor != null)
{
// 记录请求结果日志
var desc = context.ActionDescriptor as ControllerActionDescriptor;
if (desc != null)
{
var rst = context.Result as ObjectResult;
var rstValue = rst != null ? rst.Value : null;
var logText = CreateResponseLogText(
context.HttpContext.Request.Method,
desc.ControllerName,
desc.ActionName,
rstValue);
LoggerMonitor.LogDebug(logText);
ErrorLog.Write(logText);
}
}
// ErrorLog.Write(msg);
// ErrorLog.Write("==================================================================================================================================");
}
///
/// 创建请求日志文本
///
///
///
///
///
///
private static string CreateRequestLogText(string method,
string controllerName, string actionName, string requestHead,
string requestBody)
{
var sb = new StringBuilder();
sb.Append(
$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 请求{method}/{controllerName}/{actionName}接口,请求Head:{requestHead}\n");
sb.Append(
$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 请求{method}/{controllerName}/{actionName}接口,请求Body:{requestBody}\n");
return sb.ToString();
}
///
/// 创建响应日志文本
///
///
///
///
///
///
private static string CreateResponseLogText(string method,
string controllerName, string actionName, object result)
{
var sb = new StringBuilder();
sb.Append(
$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 完成请求{method}/{controllerName}/{actionName}接口,返回结果:");
if (result != null)
sb.Append($"{JsonConvert.SerializeObject(result)}");
else
sb.Append("无");
return sb.ToString();
}
}