使用Log4Net和中间件记录接口访问日志

一、功能概述

  • Log4Net

        log4net 是一个用于.NET应用程序的日志记录框架。它允许开发人员在他们的应用程序中记录各种信息,以便追踪应用程序的运行状态、排查问题和分析性能。log4net的主要作用包括:

  1. 日志记录: 记录应用程序的运行时信息,如调试信息、警告、错误和严重错误等。

  2. 灵活的日志级别: 支持不同的日志级别,如DEBUG、INFO、WARN、ERROR 和 FATAL,开发人员可以根据需要选择记录信息的严重程度。

  3. 多种输出途径: 提供多种输出方式(称为 Appenders),例如控制台输出、文件输出、数据库输出等,开发人员可以根据需求将日志信息输出到不同的地方。

  4. 日志格式化: 支持自定义日志信息的格式化,开发人员可以定义日志消息的布局,包括时间戳、线程信息等。

  5. 层次化日志配置: 支持层次化的日志配置,允许开发人员根据日志记录器的名称精细控制哪些日志消息被记录。

  6. 配置灵活性: log4net 可以通过 XML 配置文件、代码编程方式或依赖注入等多种方式进行配置,灵活适应不同的应用场景和需求。

  • 中间件:

        在软件开发中,中间件(Middleware)是指位于应用程序和操作系统之间的软件层,用于在不同的系统或应用程序之间传递数据或请求。它可以在不同的软件组件之间传递消息、转换数据格式、处理请求、执行特定的业务逻辑等。中间件通常用于以下几个方面:

  1. 请求处理和路由: 在Web开发中,中间件可以处理HTTP请求,执行身份验证、日志记录、路由等操作,然后将请求传递给应用程序处理。

  2. 消息传递: 在分布式系统中,中间件可以处理消息队列,确保消息在不同系统或服务之间可靠传递,实现解耦和异步处理。

  3. 事务处理: 中间件可以管理和协调分布式事务,确保在多个系统或服务之间的数据操作的一致性和可靠性。

  4. 数据转换和格式化: 中间件可以将数据从一种格式转换为另一种格式,以便不同系统或服务之间的互操作性。

  5. 安全性和监控: 中间件还可以实现安全控制、监控和管理,确保系统的安全性和可管理性。

二、示例

        使用Log4Net和中间件,将接口访问过程中的重要信息进行记录,输出日志文件。

  • 使用log4net进行日志记录,步骤如下:

        1. 下载log4net包 

        2. 配置log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <!-- 信息 Info.log-->
  <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
    <!--目录路径,可以是相对路径或绝对路径-->
    <param name="File" value="logs"/>
    <!--文件名,按日期生成文件夹-->
    <param name="DatePattern" value="/yyyy-MM-dd&quot;.log&quot;"/>
    <!--日志过滤-->
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="Microsoft.Hosting.Lifetime" />  <!--过滤Microsoft.Hosting.Lifetime命名空间下类打印的日志-->
      <acceptOnMatch value="false" />
    </filter>
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="System" />
      <!---->
      <acceptOnMatch value="false" />
    </filter>
    <!--追加到文件-->
    <appendToFile value="true"/>
    <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
    <rollingStyle value="Composite"/>
    <!--写到一个文件-->
    <staticLogFileName value="false"/>
    <!--单个文件大小。单位:KB|MB|GB-->
    <maximumFileSize value="200MB"/>
    <!--最多保留的文件数,设为"-1"则不限-->
    <maxSizeRollBackups value="-1"/>
    <!--日志格式-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="ERROR" />
    </filter>
  </appender>

  <!--根配置-->
  <root>
    <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->
    <appender-ref ref="InfoLog" />
  </root>

</log4net>

        3. 在程序入口program.cs文件中添加日志记录器

...
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddLog4Net("log4net.config");//配置文件路径
...
  • 使用中间件处理http请求,步骤如下:

        1. 创建两个中间件类,分别实现对接口的监控以及用户身份的验证

using Microsoft.AspNetCore.Mvc.Filters;
namespace PracticeProjects.Middleware
{
    public class RequestMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<RequestMiddleware> _logger;

        public RequestMiddleware(RequestDelegate requestDelegate, ILogger<RequestMiddleware> logger)
        {
            _next = requestDelegate;
            _logger = logger;
        }
        public  async Task InvokeAsync(HttpContext context)
        {
            try
            {
                var method = context.Request.Method;
                var path = context.Request.Path;
                _logger.LogInformation("进入RequestMiddleware中间件,请求接口[" + method + " " + path + "],");
                _logger.LogInformation("执行下一个中间件");
                await _next(context);//执行下一个中间件

                var responseStatus = context.Response.StatusCode;
                _logger.LogInformation("进入RequestMiddleware中间件,请求结果[ " + responseStatus + "]");
            }
            catch (Exception ex)
            {
                //处理异常
                _logger.LogError("请求异常["+ex.Message+"]");
            }
        }
    }
}
//创建中间件,进行身份验证
namespace PracticeProjects.Middleware
{
    public class AuthorizeMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<RequestMiddleware> _logger;

        public AuthorizeMiddleware(RequestDelegate requestDelegate, ILogger<RequestMiddleware> logger)
        {
            _next = requestDelegate;
            _logger = logger;
        }
        public async Task InvokeAsync(HttpContext context)
        {
            _logger.LogInformation("进入AuthorizeMiddleware中间件,进行身份验证!");
            //请求到达控制器之前进行身份验证
            if (!context.User.Identity.IsAuthenticated)
            {
                //未验证用户信息,执行重定向,返回401状态码
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                return;
            }
            _logger.LogInformation("身份验证通过,进入下一个步");
            await _next(context);
        }

    }
}

        2. 在程序入口启用中间件(中间件的执行顺序与它们在program.cs文件中的配置顺序有关)

...
var app = builder.Build();
//启用中间件
app.UseMiddleware<RequestMiddleware>();
app.UseMiddleware<AuthorizeMiddleware>();
...
  • 编写接口测试log4Net和中间件

using Microsoft.AspNetCore.Mvc;
namespace PracticeProjects.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class LogController : ControllerBase
    {
        private readonly ILogger<LogController> _logger;
        private readonly ILoggerFactory _fac; //用于创建和管理ILogger

        public LogController(ILogger<LogController> logger, ILoggerFactory fac)
        {
            _logger = logger;
            _fac = fac; 
        }

        [HttpGet]
        public string LogLog()
        {
            _logger.LogInformation("进入Controller!");
            return "请求成功";
            
        }
    }
}

执行结果如下:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值