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

news2024/9/22 13:30:05

一、功能概述

  • 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 "请求成功";
            
        }
    }
}

执行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单片机毕业设计选题24081】-路灯无线数据采集器

系统功能: 手机开启2.4G WiFi热点后再给系统上电 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用智能路灯系统请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后显示第一页面&#xff0c;如长时间显示Connecting...请 检…

复现open-mmlab的mmsegmentation详细细节

复现open-mmlab的mmsegmentation详细细节 1.配置环境2.数据处理3.训练 1.配置环境 stage1&#xff1a;创建python环境 conda create --name openmmlab python3.8 -y conda activate openmmlabstage2&#xff1a;安装pytorch&#xff08;这里我是以torch1.10.0为例&#xff09…

昇思25天学习打卡营第22天|Pix2Pix实现图像转换

Pix2Pix图像转换学习总结 概述 Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的深度学习模型&#xff0c;旨在实现不同图像风格之间的转换&#xff0c;如从语义标签到真实图像、灰度图到彩色图、航拍图到地图等。这一模型由Phillip Isola等人在2017年提出&…

《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取

一、深度爬取 深度爬取是指在网络爬虫中&#xff0c;获取网页上的所有链接并递归地访问这些链接&#xff0c;以获取更深层次的页面数据。 通常&#xff0c;一个简单的爬虫只会获取到初始页面上的链接&#xff0c;并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获…

vue3 父组件 props 异步传值,子组件接收不到或接收错误

1. 使用场景 我们在子组件中通常需要调用父组件的数据&#xff0c;此时需要使用 vue3 的 props 进行父子组件通信传值。 2. 问题描述 那么此时问题来了&#xff0c;在使用 props 进行父子组件通信时&#xff0c;因为数据传递是异步的&#xff0c;导致子组件无法成功获取数据…

idea设置类注释模板作者、日期、描述等信息

文章目录 前言一、新建类的时候自动添加类注释1.打开设置2.模版配置示例如下3.实际生成效果 前言 由于每次换电脑时都需要重新对idea进行设置&#xff0c;为了方便大家的开发配置&#xff0c;同时也为自己以后配置留一份记录&#xff08;毕竟每次换环境都需要重新配置一遍&…

DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null

文章目录 一、报错内容二、原因三、DB2中的VARCHAR(100)类型能存储多少汉字&#xff1f; 一、报错内容 Cause: com.ibm.db2.jcc.am.mo: DB2 SQL Error: SQLCODE-302, SQLSTATE22001, SQLERRMCnull, DRIVER3.58.82 ; DB2 SQL Error: SQLCODE-302, SQLSTATE22001, SQLERRMCnull,…

Aider + Llama 3.1:无需编码开发全栈APP

Llama 3.1在代码生成方面的卓越表现 在代码生成领域&#xff0c;Llama 3.1的表现尤为出色&#xff0c;几乎成为了开源模型中的佼佼者。它不仅在代码自动化和生成方面表现突出&#xff0c;还可以作为AI编程助手&#xff0c;帮助调试代码和开发完整的应用程序。在多个基准测试中…

【用最少数量的箭引爆气球】python刷题记录

R2-贪心篇. 求最小&#xff0c;那就尽可能地假设更多的气球y值不相同咯。 不对&#xff0c;气球除了y值我们随便摆&#xff0c;所以找尽可能多重叠的&#xff0c;就作为同一只箭。 class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:#贪心策略…

JavaScript关键词

JavaScript 关键词 JavaScript 语句常常通过某个关键词来标识需要执行的 JavaScript 动作。 下面的表格列出了一部分将在教程中学到的关键词&#xff1a; 关键词 描述 break 终止 switch 或循环。 continue 跳出循环并在顶端开始。 debugger 停止执行 JavaScript&…

powershell自定义命令别名

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、查看命令别名二、常见的别名三、自定义别名1.GUI编辑2.命令行编辑 总结 前言 有时候在windows上使用powershell时候常常苦于别名问题&#xff0c;像我这样…

Windows系统下cython_bbox库的正确安装步骤最简单方法

​ 最近做的项目需要安装cython_bbox包&#xff0c;但是当我天真的输入pip install cython_bbox准备满心欢喜的等待安装成功却发现…&#xff0c;它报错了&#xff0c;这是一个从未见过的、非常长的报错&#xff0c;它长这个样子&#xff1a; ​​ 因此不能直接通过pip安装&am…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别&#xff1f; OSI模型由国标准化组织提出&#xff0c;而TCP/IP模型是由美国国防部开发的&#xff1b; OSI模型由七个层次组成&#xff0c;从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

心动小站Ⅸ--Nvidia一种夸张的增长

当有灭绝级别的威胁时&#xff0c;你希望它如何出现在头版&#xff1f;华尔街日报或 CNN 的新闻中说它即将发生&#xff1f; 大多数新闻都是在灾难发生后才传到你耳中的。谈到人工智能&#xff0c;我们已经收到了很多警告&#xff0c;这些警告来自各个领域的专家&#xff0c;比…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

jquery+bootstrap实现DOM转图片并下载

&#x1f34a;jquery实现DOM结构转图片并下载 版本介绍&#xff1a; Bootstrap v3.3.7jQuery v3.5.1domToImage.js 根据Bootstrap实现dialog上一步下一步多个弹窗交互进行大肆修改&#xff0c;完善了第二步生成图片的功能与更强的交互 1.、功能说明 重新设置bootstrap主题色 …

JAVA.抽象、接口、内部类

1.抽象 共性&#xff0c;父类定义抽象方法&#xff0c;子类必须重写&#xff0c;或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat&#xff0c;子类必须重写public abs…

《企业实战分享 · CodeGeeX 初体验》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

企业级视频拍摄与编辑SDK的全面解决方案

视频已成为企业传播信息、展示品牌、连接用户的重要桥梁&#xff0c;如何高效、专业地制作高质量视频内容&#xff0c;成为众多企业面临的共同挑战。美摄科技&#xff0c;作为视音频技术领域的创新先锋&#xff0c;以其强大的视频拍摄与编辑SDK&#xff0c;为企业量身打造了一站…

react中简单的配置路由

1.安装react-router-dom npm install react-router-dom 2.新建文件 src下新建page文件夹&#xff0c;该文件夹下新建login和index文件夹用于存放登录页面和首页&#xff0c;再在对应文件夹下分别新建入口文件index.js&#xff1b; src下新建router文件用于存放路由配置文件…