首页 > 其他分享 >AOP拦截日志

AOP拦截日志

时间:2023-07-23 17:23:19浏览次数:34  
标签:记录 Nlog AOP invocation 日志 拦截

首先对于AOP切面编程,我也是刚学习,了解不深,这边先引用老张的博客,方便大家学习。

首先想一想,如果有这么一个需求,要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过滤器或者一个中间件,还记得咱们开发Swagger拦截权限验证的中间件么,那个就很方便的把用户调用接口的名称记录下来,当然也可以写成一个切面,但是如果想看下与Service或者Repository层的调用情况呢,好像目前咱们只能在Service层或者Repository层去写日志记录了,那样的话,不仅工程大(当然你可以用工厂模式),而且耦合性瞬间就高了呀,想象一下,如果日志要去掉,关闭,修改,需要改多少地方!您说是不是,好不容易前边的工作把层级的耦合性降低了。别慌,这个时候就用到了AOP和Autofac的Castle结合的完美解决方案了。

【 .NET Core 3.0 】框架之十 || AOP 切面思想 (qq.com)

下面是我自己根据老张博客实现的记录日志功能和体会,只针对于实现记录日志这一功能,其他的涉及还不深

正文开始

一开始我记录日志是Nlog,采用autofac注入。然后在服务层仓储层或者你想记录的地方去注入然后记录日志,NLog的使用教程我也有记录,可以翻看一下:

但是这样每一个方法每一个类都要进行注入。上边 的引用所说的 耦合性增加,因为我是通过Autofac程序集依赖注入的,耦合性倒还好。最大的问题可能在于,每一个方法我都要单独的去写日志记录。就很麻烦,因此采用这种AOP拦截记录日志,方便很多。

专业术语很多,我也不是很理解,感觉挺牛的。不过单独针对于记录日志这方面,还是挺简单的。

老张的项目结构式有一个扩展的类库,专门来搞这些。我添加到了Common公共类库里,操作完之后,感觉对于我自己的项目直接写在API底下应该更方便,因为一开始使用autofac是安装到仓储层了。这样一层层的调用 API>IService>IRepository 可以少安装Get包和少一些引用。不过也没什么关系了,Common本身我打算的就是任何地方都可以去引用(不过因为没有Nlog包所有多安装了一个,以后精通了再修改完善吧)。

1
  1. 创建一个类,继承[IInterceptor]  我这里是记录日志的,叫LogAOP

  2. 继承之后,实现这个类的唯一方法Intercept

  3. 记录日志的过程在方法Intercept里实现,我会配合我自己的代码来写对应的注释。

 public class LogAOP : IInterceptor
    {
        protected readonly ILogger<LogAOP> Nlog;

        /// <summary>
        /// 采用Nlog记录日志,同样使用构造函数注入Nlog
        /// </summary>
        /// <param name="logger"></param>
        public LogAOP(ILogger<LogAOP> logger)
        {
            Nlog = logger;
        }

        /// <summary>
        /// 实现继承IInterceptor的方法
        /// </summary>
        /// <param name="invocation"></param>
        public void Intercept(IInvocation invocation)
        {
            //记录日志的String,在请求接口的时候会先进行拦截,可以获取到方法的名称,方法在哪个位置,所带参数等
            var dataIntercept = "\n\t" +
                 $"【当前执行方法:{invocation.Method.Name}】\n\t" +
                 $"【携带的参数有:{string.Join(",", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray())}】\n\t" +
                 $"【当前执行方法的位置:{invocation.InvocationTarget}】\n\t";

            try
            {
                //这个Proceed是执行这个方法,不写的话就204,不会处理该请求
                invocation.Proceed();
                //如果Proceed成功执行,则返回到请求的结果
                dataIntercept += ($"【执行完成结果:】{JsonSerializer.Serialize(invocation.ReturnValue)}");
            }
            catch (Exception e)
            {
                //如果Proceed里面异常了,就会在此处获取到异常信息。
                dataIntercept += ($"【方法异常:】{e.Message + e.InnerException}");
            }
            //为了在日志里划分区域范围,容易查看
            dataIntercept += ("\n\n=======================================================================");
            //这个地方目前我不知道怎么解释,但是记录日志要写在里面
            Parallel.For(0, 1, e =>
            {
                Nlog.LogInformation(dataIntercept);
            });
        }
    }

然后就是将这个类注入到程序内。红框里的是注入aop拦截新加 的,其余的就是注入仓储和服务层的,这种比较偏底层,目前我无法解释太清楚,如果有大佬看到了可以解释一二。我的理解呢就是

2
  1. builder.RegisterType<LogAOP>();//将拦截器注册,但此时还没有确定注入到哪个地方……

  2. EnableInterfaceInterceptors:添加一个拦截,表示给你的程序哪个位置添加拦截,比如我要添加我的Service和Repository层

  3.  

    InterceptedBy() :将XX拦截功能注册到服务,这个就是要将第一步你注入的拦截器添加到指定的位置

     

 看看我的效果:

 

标签:记录,Nlog,AOP,invocation,日志,拦截
From: https://www.cnblogs.com/zhang-3/p/17575283.html

相关文章

  • docker查看具体时间日志
    Docker查看具体时间日志简介在使用Docker进行应用部署的过程中,经常需要查看容器的日志信息,以便排查问题和进行调试。本文将介绍如何使用Docker命令和相关技术,查看具体时间的日志信息。步骤概览下表展示了Docker查看具体时间日志的步骤概览:步骤描述1定位到特定的Dock......
  • java 拦截、过滤器2
    一、概述在SpringMVC中,除了Filter和Interceptor拦截器外,还有对请求Controller的处理,即对请求和响应内容的处理和对请求参数的处理。二、ControllerAdvice@ControllerAdvice本质上同Component一样,因此也会被当成组件扫描。其中@ExceptionHandler常用到。即抛出的异常会被统一......
  • java拦截Filter和过滤器HandlerInterceptor
    什么是过滤器过滤器Filter是基于Servlet实现,对进入到Servlet的请求拦截。主要用于对字符编码,跨域等问题过滤。如下图:所有的请求和都经过Filter,通过定义Filter,能够对请求进行编码操作。代码是以接口的形式提供:publicinterfaceFilter{defaultvoidinit(FilterConfigfilt......
  • 一文搞懂:什么是AOP?为什么要使用AOP?
    1、AOP解决什么问题在讲AOP之前,我们先来看下面的例子:现在我们有一个控制器UserControler,有查询,新增,编辑,删除用户等操作。publicclassUserController{publicvoidquery(){//查询用户操作}publicvoidadd(){//添加用户操作}publi......
  • AOP详解
    使用AOPAOP(AspectOrientedProgramming),即面向切面编程。AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。要理解AOP的概念,我们先用OOP举例,先回顾一下OOP(ObjectOrientedProgramming),OOP作为面向对象编程的模......
  • 如何动态修改 spring aop 切面信息?让自动日志输出框架更好用
    业务背景很久以前开源了一款auto-log自动日志打印框架。其中对于spring项目,默认实现了基于aop切面的日志输出。但是发现一个问题,如果切面定义为全切范围过大,于是v0.2版本就是基于注解@AutoLog实现的。只有指定注解的类或者方法才会生效,但是这样使用起来很不方便。......
  • 聊聊日志聚类算法及其应用场景
    阅读《基于FlinkML搭建的智能运维算法服务及应用》一文后,对其中日志聚类算法有了些思考。概述日志聚类,简而言之是对海量日志的分析;其分析处理链路可以分为如下流程:日志采集->预处理->分词和特征表示->聚类和标注。算法模型分析针对如上的链路流程做一个拆分叙述。日......
  • [TSG@Site开发日志3]从C#到Qt,再从Qt到C# 和 Qt的组合开发,浅谈在采集端工控设备开发中
    [TSG开发日志3]从C#到Qt,再从Qt到C#,浅谈不同技术之间选型的利与弊当前在South公司的开发历经了几个时代,第一个时代是用C#进行的开发,第二个时代是从C#向Qt逐渐转型,第三个时代是我现在站在十字路口上,又需要将采集端软件从Qt的路上拉回来。为什么先看看AI怎么说选择使用C#还是Qt来......
  • Postgresql日志归档、复制槽概念
    问题1数据日志什么时候归档?其实这个问题是比较需要明白的,到底日志在正常的情况下,什么时候才能归档,到底条件是什么,要开启postgresql的日志的归档的前提条件,主要需要配置1wal_level=replica(或logical)2archive_mode=on3archive_command='test!-......
  • AOP
    AOP依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>第一种方式:packagecom.atguigu.activity.aop;​impor......