• 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));
                });
  • 相关阅读:
    c++中string类中的函数
    二进制
    快速幂
    substring
    hdu 4678
    扩展欧几里得算法
    欧几里得算法
    Floyd_Warshall(任意两点之间的最短路)
    带结构体的优先队列
    php获得远程信息到本地使用的3个函数:file_get_contents和curl函数和stream_get_contents
  • 原文地址:https://www.cnblogs.com/lgyup/p/16194751.html
Copyright © 2020-2023  润新知