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("=================================================================================================================================="); } } }