Asp.Net Core WebApi使用方法过滤器记录日志
在 Asp.Net Core WebApi中,使用方法过滤器拦截请求和响应,对请求和响应的内容进行日志记录,详见代码:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WebApi { /// <summary> /// 方法过滤器 /// </summary> public class ActionFilter : IActionFilter { /// <summary> /// 监控日志 /// </summary> public static ILogger LoggerMonitor { get; set; } /// <summary> /// 错误日志 /// </summary> public static ILogger LoggerError { get; set; } /// <summary> /// 创建请求日志文本 /// </summary> /// <param name="method">请求方法</param> /// <param name="controllerName">控制器名称</param> /// <param name="actionName">方法名称</param> /// <param name="actionArgs">方法参数</param> /// <returns></returns> private static string CreateRequestLogText(string method, string controllerName, string actionName, IDictionary<string, object> actionArgs) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"收到请求[{method}]/{controllerName}/{actionName},参数:"); if (actionArgs.Count > 0) { foreach (var p in actionArgs) { sb.AppendLine($" " + p.Key + ":" + Newtonsoft.Json.JsonConvert.SerializeObject(p.Value)); } } else { sb.AppendLine(" 无"); } return sb.ToString(); } /// <summary> /// 创建响应日志文本 /// </summary> /// <param name="method">请求方法</param> /// <param name="controllerName">控制器名称</param> /// <param name="actionName">方法名称</param> /// <param name="result">执行结果</param> /// <returns></returns> private static string CreateResponseLogText(string method, string controllerName, string actionName, object result) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"完成请求[{method}]/{controllerName}/{actionName},结果:"); if (result != null) { sb.AppendLine(" " + Newtonsoft.Json.JsonConvert.SerializeObject(result)); } else { sb.AppendLine(" 无"); } return sb.ToString(); } /// <summary> /// 方法执行前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { if (LoggerMonitor != null) { // 记录请求参数日志 ControllerActionDescriptor desc = context.ActionDescriptor as ControllerActionDescriptor; if (desc != null) { var logText = CreateRequestLogText( context.HttpContext.Request.Method, desc.ControllerName, desc.ActionName, context.ActionArguments); LoggerMonitor.Debug(logText); } } } /// <summary> /// 方法执行后 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { if (context.Exception != null) { // 记录异常日志 if (LoggerError != null) { LoggerError.Error(context.Exception, context.Exception.Message); } } 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.Debug(logText); } } } } }
然后,在WebApi的Startup类的ConfigureServices中启用方法过滤器,代码为:
services.AddMvc(options => { options.Filters.Add(typeof(ActionFilter)); });