【NetCore7】Web API记录请求与响应到日志,使用log4net?

img


net7实现这个效果,记录ngnix前面的实际客户端IP地址,ngnix地址,微服务器地址,请求接口,响应结果,入参、出参等等,使用log4net写日志

在 .NET Core 3.0 及更高版本中,可以使用 Microsoft.Extensions.Logging 库来记录 Web API 的请求和响应到日志。

可以在过滤器里获取


public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers(v => v.Filters.Add<MyFilter>());
}
//处理跨域请求
public class MyFilter : IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext context)
            {
                var http = context.HttpContext;
                http.Response.Headers.Add("Access-Control-Allow-Origin", "*");
                if (http.Request.Method == "OPTIONS")
                {
                    http.Response.StatusCode = 200;
                    http.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, think-lang, server, token");
                }
            }

            public void OnActionExecuting(ActionExecutingContext context)
            {
                context.HttpContext.Request.Headers.Add("Access-Control-Allow-Origin", "*");
            }
        }

手动大日志可以

可以自动定义一个通用的记录日志方法可以存数据库、文件等方式,然后在每个接口内调用,如果这个工作量不大的话。可以这样操作。

找个开源的

安装log4net NuGet包。添加log4net.config文件 ,在项目的AssemblyInfo.cs文字添加log4net配置等:
具体参考:https://blog.csdn.net/weixin_38211198/article/details/124062821

【WebAPI】Web API记录请求与响应到日志,使用log4net
可以参考下

参考gpt:
结合自己分析给你如下建议:
在您的项目中安装log4net包。您可以使用NuGet包管理器来搜索和安装log4net。
在您的项目中添加一个log4net配置文件,如log4net.config。您可以在这个文件中定义日志的级别、格式、输出目标等。您可以参考这个示例来创建您自己的配置文件。
在您的项目中初始化log4net,并获取一个ILog接口的实例。您可以在Startup.cs中使用Log4NetProviderFactory来初始化log4net,并在需要记录日志的类中使用LogManager.GetLogger来获取ILog实例。
在您的控制器或服务中,使用ILog实例的方法来记录请求和响应的内容。例如,您可以使用Info、Error、Fatal等方法来记录不同级别的日志信息。您可以在请求和响应的过滤器中使用HttpContext对象来获取客户端IP地址、请求接口、入参、出参等信息,并将它们记录到日志中。
以下是一个简单的示例代码,展示了如何在控制器中记录请求和响应的内容:

using log4net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // 获取ILog实例
        private readonly ILog _logger = LogManager.GetLogger(typeof(ValuesController));

        // 请求过滤器,记录请求内容
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
            // 获取客户端IP地址
            var clientIp = context.HttpContext.Connection.RemoteIpAddress.ToString();
            // 获取请求接口
            var requestUrl = context.HttpContext.Request.Path;
            // 获取入参
            var inputParams = context.ActionArguments;
            // 记录请求内容
            _logger.Info($"Client IP: {clientIp}, Request URL: {requestUrl}, Input Params: {inputParams}");
        }

        // 响应过滤器,记录响应内容
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
            // 获取响应结果
            var result = context.Result as ObjectResult;
            // 记录响应内容
            _logger.Info($"Response Result: {result}");
        }

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
}

思路:用自定义中间件在 .NET Core 7 中记录请求和响应的详细信息,集成 log4net 实现日志写入实现记录nginix前置真实客户端 IP 地址、nginix 地址、微服务器地址、请求接口、响应结果、入参和出参等信息的功能

nginx 作为反向代理,将客户端的请求转发到微服务,然后在微服务中用 log4net 记录日志

【WebAPI】Web API记录请求与响应到日志,使用log4net_web api 日志记录 全局_GreAmbWang的博客-CSDN博客 在编写API功能时,记录调用日志是必不可少的功能,日志在后续分析问题起到一个非常重要的作用。这里使用log4net作为日志记录。_web api 日志记录 全局 https://blog.csdn.net/weixin_38211198/article/details/124062821?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169287172916800185861298%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169287172916800185861298&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-124062821-null-null.142^v93^chatsearchT3_2&utm_term=%E3%80%90NetCore7%E3%80%91Web%20API%E8%AE%B0%E5%BD%95%E8%AF%B7%E6%B1%82%E4%B8%8E%E5%93%8D%E5%BA%94%E5%88%B0%E6%97%A5%E5%BF%97%EF%BC%8C%E4%BD%BF%E7%94%A8log4net%EF%BC%9F&spm=1018.2226.3001.4187

参考gpt
要在.NET Core 7的Web API中记录请求和响应到日志,并使用log4net进行日志记录,您可以按照以下步骤进行操作:

  1. 添加log4net依赖项:在您的.NET Core 7项目中,通过NuGet包管理器或手动方式添加log4net依赖项。

  2. 配置log4net:在您的项目根目录下创建一个名为log4net.config的文件,并添加以下示例配置:

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="logs/logfile.log" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="FileAppender" />
  </root>
</log4net>

此配置将日志记录到logs/logfile.log文件中。

  1. Program.cs文件中启用log4net:在CreateHostBuilder方法中添加以下代码:
.ConfigureLogging((hostingContext, logging) =>
{
    logging.ClearProviders();
    logging.AddLog4Net(); // 添加log4net日志提供程序
})
  1. Startup.cs文件中配置中间件:在Configure方法中添加以下代码:
app.Use(async (context, next) =>
{
    // 记录请求
    var request = context.Request;
    var logger = LogManager.GetLogger(typeof(Startup));
    logger.Info($"Request: {request.Method} {request.Path}");

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

        await next();

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

        logger.Info($"Response: {context.Response.StatusCode} {responseBodyText}");

        await responseBody.CopyToAsync(originalBodyStream);
    }
});

这段代码将在每个请求和响应期间记录相关信息,并使用log4net记录到日志文件中。

  1. 在需要记录日志的地方使用log4net:在您的控制器或其他地方,通过以下方式使用log4net进行日志记录:
var logger = LogManager.GetLogger(typeof(YourController));
logger.Info("Your log message");

确保将YourController替换为您的控制器的类型。