using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using System.Diagnostics;
using System.Text;
namespace MESApplication
{
///
/// 方法过滤器
///
public class ActionFilter : IActionFilter
{
///
/// 监控日志
///
public static ILogger LoggerMonitor { get; set; }
///
/// 错误日志
///
public static ILogger LoggerError { get; set; }
private Stopwatch _stopwatch;
///
/// 创建请求日志文本
///
///
///
///
///
///
private static string CreateRequestLogText(string method, string controllerName, string actionName, string requestHead, string requestBody)
{
StringBuilder 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)
{
StringBuilder 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();
}
///
/// 方法执行前
///
///
///
public async void OnActionExecuting(ActionExecutingContext context)
{
// ErrorLog.Write("==================================================================================================================================");
_stopwatch = new Stopwatch();
_stopwatch.Start();
//throw new NotImplementedException();
if (LoggerMonitor != null)
{
//记录请求参数日志
ControllerActionDescriptor desc = context.ActionDescriptor as ControllerActionDescriptor;
if (desc != null)
{
Dictionary 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);
Dictionary 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();
long elaspsedMillisedconds = _stopwatch.ElapsedMilliseconds;
string 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)
{
// 记录请求结果日志
ControllerActionDescriptor desc = context.ActionDescriptor as ControllerActionDescriptor;
if (desc != null)
{
ObjectResult rst = context.Result as ObjectResult;
object 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("==================================================================================================================================");
}
}
}