.netcore2.1 添加Action接口请求全局日志打印filter

 

  • 添加过滤器

  

复制代码
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.IO;
using System.Text;

namespace MyPro.Filters
{
    public class LogFilter : IActionFilter
    {
        ILogger _logger;
        public LogFilter(ILogger<LogFilter> logger)
        {
            _logger = logger;
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (!(context.Result is FileStreamResult))
            {
                var statusCode = context.HttpContext.Response.StatusCode;
                var result = context.Result;
                _logger.LogInformation($"HashCode:{context.HttpContext.Request.GetHashCode()},路由:{context.HttpContext.Request.Path},响应码{statusCode},出参{JsonConvert.SerializeObject(result)}");
            }
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Request.Path != null && !context.HttpContext.Request.Path.Value.ToLower().Contains("/user/login"))
            {
                var header = context.HttpContext.Request.Headers;
                var query = context.HttpContext.Request.Query;
                var body = string.Empty;
                if (context.HttpContext.Request.Method.ToUpper() == "POST")
                {

                    context.HttpContext.Request.EnableRewind();
                    context.HttpContext.Request.Body.Seek(0, 0);
                    using (var ms = new MemoryStream())
                    {
                        context.HttpContext.Request.Body.CopyTo(ms);
                        var b = ms.ToArray();
                        body = Encoding.UTF8.GetString(b);
                    }
                }
                var log = new { query, header, body };
                _logger.LogInformation($"HashCode:{context.HttpContext.Request.GetHashCode()},路由:{context.HttpContext.Request.Path},入参{JsonConvert.SerializeObject(log)}");
            }
        }
    }
}
复制代码

 

  • 在Startup.cs中注入服务
  services.AddMvc(options =>
            {
                options.Filters.Add(typeof(LogFilter));
              
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddJsonOptions(options =>
            {
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            });

 

posted @   低调码农哥!  阅读(288)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示