一、功能概述
-
Log4Net
log4net 是一个用于.NET应用程序的日志记录框架。它允许开发人员在他们的应用程序中记录各种信息,以便追踪应用程序的运行状态、排查问题和分析性能。log4net的主要作用包括:
-
日志记录: 记录应用程序的运行时信息,如调试信息、警告、错误和严重错误等。
-
灵活的日志级别: 支持不同的日志级别,如DEBUG、INFO、WARN、ERROR 和 FATAL,开发人员可以根据需要选择记录信息的严重程度。
-
多种输出途径: 提供多种输出方式(称为 Appenders),例如控制台输出、文件输出、数据库输出等,开发人员可以根据需求将日志信息输出到不同的地方。
-
日志格式化: 支持自定义日志信息的格式化,开发人员可以定义日志消息的布局,包括时间戳、线程信息等。
-
层次化日志配置: 支持层次化的日志配置,允许开发人员根据日志记录器的名称精细控制哪些日志消息被记录。
-
配置灵活性: log4net 可以通过 XML 配置文件、代码编程方式或依赖注入等多种方式进行配置,灵活适应不同的应用场景和需求。
-
中间件:
在软件开发中,中间件(Middleware)是指位于应用程序和操作系统之间的软件层,用于在不同的系统或应用程序之间传递数据或请求。它可以在不同的软件组件之间传递消息、转换数据格式、处理请求、执行特定的业务逻辑等。中间件通常用于以下几个方面:
-
请求处理和路由: 在Web开发中,中间件可以处理HTTP请求,执行身份验证、日志记录、路由等操作,然后将请求传递给应用程序处理。
-
消息传递: 在分布式系统中,中间件可以处理消息队列,确保消息在不同系统或服务之间可靠传递,实现解耦和异步处理。
-
事务处理: 中间件可以管理和协调分布式事务,确保在多个系统或服务之间的数据操作的一致性和可靠性。
-
数据转换和格式化: 中间件可以将数据从一种格式转换为另一种格式,以便不同系统或服务之间的互操作性。
-
安全性和监控: 中间件还可以实现安全控制、监控和管理,确保系统的安全性和可管理性。
二、示例
使用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".log""/>
<!--日志过滤-->
<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 "请求成功";
}
}
}
执行结果如下: