AOP拦截日志

aop,拦截,日志 · 浏览次数 : 15

小编点评

**AOP切面编程记录日志功能** **简介:** AOP切面编程可以将日志记录封装到切面中,方便多个类之间日志记录。对于记录接口和调用情况,传统的日志记录方法难以满足需求。 **解决方案:** 使用AOP和Autofac的Castle结合的记录日志功能。 **步骤:** 1. **创建一个记录日志类的继承类:** ```csharp public class LogAOP : IInterceptor ``` 2. **在日志类中实现Intercept方法:** ```csharp public void Intercept(IInvocation invocation) { //记录日志的String,在请求接口的时候会先进行拦截,可以获取到方法的名称,方法在哪个位置,所带参数等 var dataIntercept = $"\\\t\" + invocation.Method.Name + "\\t\" + invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray().ToString() + $"\t\" + invocation.InvocationTarget; //写入日志 Nlog.LogInformation(dataIntercept); } ``` 3. **在程序中注册记录日志拦截器:** ```csharp //使用Autofac注册拦截器 public void Configure(IApplicationBuilder app) { //注册服务和仓储层拦截器 app.UseInterceptors(); } ``` **效果:** 记录接口和调用情况,并将日志记录到指定日志库中。 **优点:** * 降低耦合性,方便维护。 * 方便日志记录和调试。 * 可以记录接口和调用情况。 **注意:** * 日志记录的格式可能因日志库设置而有所不同。 * 可以根据需求修改记录的信息,例如添加日志等级、日志格式等。

正文

首先对于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拦截功能注册到服务,这个就是要将第一步你注入的拦截器添加到指定的位置

 看看我的效果:

 

与AOP拦截日志相似的内容:

AOP拦截日志

首先对于AOP切面编程,我也是刚学习,了解不深,这边先引用老张的博客,方便大家学习。 首先想一想,如果有这么一个需求,要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过滤器或者一个中间件,还记得咱们开发Swagger拦截权限验证的中间件么,那个就很方便的把用户调用接口

通过AOP拦截Spring Boot日志并将其存入数据库

本文将介绍如何使用Spring Boot和AOP技术实现拦截系统日志并保存到数据库中的功能。

Rougamo、Fody 实现静态Aop

最近在看项目,看到别人使用Rougamo框架,好奇花了点时间仔细研究了,在这里记录一下。 0. 静态编织 Aop 首先,我们先了解什么是Aop? Aop 是指面向切面编程 (Aspect Oriented Programming),而所谓的切面,可以认为是具体拦截的某个业务点。 我们常用的aop框架

iOS开发基础136-防暴力点击

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤: 第一步:引入Aspects库 首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,

SpringBoot 过滤器更改 Request body ,并实现数据解密

客户端、服务端网络通信,为了安全,会对报文数据进行加解密操作。 在SpringBoot项目中,最好使用参考AOP思想,加解密与Controller业务逻辑解耦,互不影响。 以解密为例:需要在request请求到达Controller之前进行拦截,获取请求body中的密文并对其进行解密,然后把解密后的

AOP(面向切面编程)

AOP(Aspect Oriented Programming,面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP-Redis缓存

我没有单独使用过Redis,细节我可能解释不到位。该文章是采用依赖注入实现AOP-Redis缓存功能的 、 之前有写实现Memory缓存的。异曲同工之妙。 使用Redis离不开安装get包:StackExchange.Redis. 操作流程: 创建一个RedisAOP的.cs文件。继承IInterc

深入理解Spring AOP中的@EnableAspectJAutoProxy

本文详细探讨了Spring框架中的面向切面编程(AOP),特别是通过@EnableAspectJAutoProxy注解来启用和配置AOP的详细过程。

Spring 面向切面编程AOP 详细讲解

1. Spring 面向切面编程AOP 详细讲解 @目录1. Spring 面向切面编程AOP 详细讲解每博一文案2. AOP介绍说明2.1 AOP的七大术语2.2 AOP 当中的 切点表达式3. 使用Spring 对 AOP 的实现使用3.1 准备工作3.2 Spring 基于AspectJ的AO

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

目录什么是 AOP ?.Net Core 中 有哪些 AOP 框架?基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP ? AOP(Aspect-Oriented Programming,面向切面