首页 > 其他分享 >NetCore的全局日志记录

NetCore的全局日志记录

时间:2024-07-02 19:57:41浏览次数:1  
标签:Body NetCore AppendLine Response requestLog context var 日志 全局

Http进来的数据和出去的数据都记录在log中

public class HttpLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<HttpLoggingMiddleware> _logger;

    public HttpLoggingMiddleware(RequestDelegate next, ILogger<HttpLoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 记录请求信息
        var request = context.Request;
        var requestLog = new StringBuilder();
        requestLog.AppendLine("HTTP Request Information:");
        requestLog.AppendLine($"Method: {request.Method}");
        requestLog.AppendLine($"Path: {request.Path}");
        requestLog.AppendLine("Headers:");
        foreach (var header in request.Headers)
        {
            requestLog.AppendLine($"{header.Key}: {header.Value}");
        }
        requestLog.AppendLine("Query Parameters:");
        foreach (var param in request.Query)
        {
            requestLog.AppendLine($"{param.Key}: {param.Value}");
        }

        if (request.ContentLength > 0)
        {
            request.EnableBuffering();
            using (var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
            {
                var body = await reader.ReadToEndAsync();
                requestLog.AppendLine($"Body: {body}");
                request.Body.Position = 0;
            }
        }

        _logger.LogInformation(requestLog.ToString());

        // 记录响应信息
        var originalBodyStream = context.Response.Body;
        using (var responseBody = new MemoryStream())
        {
            context.Response.Body = responseBody;

            await _next(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            var responseText = await new StreamReader(context.Response.Body).ReadToEndAsync();
            context.Response.Body.Seek(0, SeekOrigin.Begin);

            if (context.Response.ContentType != null && context.Response.ContentType.Contains("application/json"))
            {
                var responseLog = new StringBuilder();
                responseLog.AppendLine("HTTP Response Information:");
                responseLog.AppendLine($"Status Code: {context.Response.StatusCode}");
                responseLog.AppendLine("Headers:");
                foreach (var header in context.Response.Headers)
                {
                    responseLog.AppendLine($"{header.Key}: {header.Value}");
                }
                responseLog.AppendLine($"Body: {responseText}");

                _logger.LogInformation(responseLog.ToString());
            }

            await responseBody.CopyToAsync(originalBodyStream);
        }
    }
}

 

app.UseMiddleware<HttpLoggingMiddleware>();

 

标签:Body,NetCore,AppendLine,Response,requestLog,context,var,日志,全局
From: https://www.cnblogs.com/ZkbFighting/p/18280459

相关文章

  • Spring Boot:轻松设置全局异常处理
    SpringBoot:轻松设置全局异常处理在软件开发中,异常处理是一项至关重要的任务。对于使用SpringBoot的开发者来说,设置全局异常处理不仅可以提高代码的整洁度,还可以提升用户体验。本文将详细介绍如何在SpringBoot中轻松设置全局异常处理,并涵盖一些相关的SpringBoot特性,如国......
  • logstash 收集 http POST请求中的json日志时,字段冲突问题
    https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http.html修改vim/etc/logstash/logstash.ymlpipeline.ecs_compatibility:disabled不关闭的话,会自动添加这几个字段可能会与json中的同名字段冲突{"@version"=>"1","user_agent"......
  • 解决接入sleuth链路追踪后xxl-job定时任务的日志无日志问题
    问题背景随着业务规模的不断的增大,系统的复杂度也越来越高,公司软件架构也进入到了分布式微服务的阶段,在这样的情况下每一次请求都有可能跨越多个项目,传统的日志监控方式无法满足调用链路追踪,这就导致问题定位/诊断服务变得复杂。所以我们引入了sleuth这一链路追踪框架为......
  • go中实现日志级别与切割,日志配置热生效,pprof的技术解析
    引言在线上分布式系统和微服务架构中,日志记录是排查问题、调试程序和监控服务运行状态的重要手段。合理设置日志级别,可以帮助开发和运维人员有效地获取所需信息。然而,在实际运行中,常常需要在不重启服务的情况下动态调整日志级别,以适应不同的调试需求和运行环境。本文基于g......
  • 【Springboot】基于AOP实现操作日志记录
    基于AOP实现操作日志记录文章目录基于AOP实现操作日志记录前言一、AOP1.介绍2.AOP核心概念二、基于AOP实现操作日志记录1.准备工作2.创建自定义注解和切面类3.实现日志记录总结前言 在springboot项目中,往往需要在用户完成某些操作(例如:增,删,改)时,能够将相关操作信......
  • Vue3手写一个全局命令式loading组件
    实现效果:vue文件中,打开全局loading...2s后关闭全局命令式loading,效果展示完,直接咱就是上代码 注册:  <!--src/components/myLoading/index.vue--><template><!--添加name属性,以添加样式Transition主要做一个淡入淡出的--><Transitionname="zhLoadi......
  • 技术派全局异常处理
    前言全局的异常处理是Java后端不可或缺的一部分,可以提高代码的健壮性和可维护性。在我们的开发中,总是难免会碰到一些未经处理的异常,假如没有做全局异常处理,那么我们返回给用户的信息应该是不友好的,很抽象的,用户会认为我们的程序是不安全的。相反,如果有了全局异常处理,那么......
  • 深入理解C# log4Net日志框架:功能、使用方法与性能优势
    文章目录1、log4Net的主要特性2、log4Net框架详解配置日志级别3、log4Net的使用示例4、性能优化与对比5、总结与展望在软件开发过程中,日志记录是一个不可或缺的功能。它可以帮助开发者追踪错误、监控应用程序性能,以及进行调试。在C#生态系统中,log4Net是一个流行的......
  • 玄机-第一章 应急响应-Linux日志分析
    玄机-第一章应急响应-Linux日志分析账号root密码linuxrzsshroot@IP1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割3.爆破用户名字典是什么?如果有多个使用","分割4.登陆成功的IP共爆破了多少次5.黑客登陆主机......
  • 2024/7/1工作日志
    (一)今日总结今天主要是安排上了住宿,同梁总和公司一众工作骨干进行了协调工作会议,把整个排产的一套实际业务流程走了一遍,为后续项目推进提供实际构思。主要由负责排产这块的冯丽冯经理与杜经理进行持续沟通,还有负责运营的赵总。1.上午主要同冯经理进行了二次的深入协调沟通,主要针......