AOP拦截日志
首先对于AOP切面编程,我也是刚学习,了解不深,这边先引用老张的博客,方便大家学习。
首先想一想,如果有这么一个需求,要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过滤器或者一个中间件,还记得咱们开发Swagger拦截权限验证的中间件么,那个就很方便的把用户调用接口的名称记录下来,当然也可以写成一个切面,但是如果想看下与Service或者Repository层的调用情况呢,好像目前咱们只能在Service层或者Repository层去写日志记录了,那样的话,不仅工程大(当然你可以用工厂模式),而且耦合性瞬间就高了呀,想象一下,如果日志要去掉,关闭,修改,需要改多少地方!您说是不是,好不容易前边的工作把层级的耦合性降低了。别慌,这个时候就用到了AOP和Autofac的Castle结合的完美解决方案了。
下面是我自己根据老张博客实现的记录日志功能和体会,只针对于实现记录日志这一功能,其他的涉及还不深
正文开始
一开始我记录日志是Nlog,采用autofac注入。然后在服务层仓储层或者你想记录的地方去注入然后记录日志,NLog的使用教程我也有记录,可以翻看一下:
但是这样每一个方法每一个类都要进行注入。上边 的引用所说的 耦合性增加,因为我是通过Autofac程序集依赖注入的,耦合性倒还好。最大的问题可能在于,每一个方法我都要单独的去写日志记录。就很麻烦,因此采用这种AOP拦截记录日志,方便很多。
专业术语很多,我也不是很理解,感觉挺牛的。不过单独针对于记录日志这方面,还是挺简单的。
老张的项目结构式有一个扩展的类库,专门来搞这些。我添加到了Common公共类库里,操作完之后,感觉对于我自己的项目直接写在API底下应该更方便,因为一开始使用autofac是安装到仓储层了。这样一层层的调用 API>IService>IRepository 可以少安装Get包和少一些引用。不过也没什么关系了,Common本身我打算的就是任何地方都可以去引用(不过因为没有Nlog包所有多安装了一个,以后精通了再修改完善吧)。
1
创建一个类,继承[IInterceptor] 我这里是记录日志的,叫LogAOP
继承之后,实现这个类的唯一方法Intercept
记录日志的过程在方法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
builder.RegisterType<LogAOP>();//将拦截器注册,但此时还没有确定注入到哪个地方……
EnableInterfaceInterceptors:添加一个拦截,表示给你的程序哪个位置添加拦截,比如我要添加我的Service和Repository层
InterceptedBy() :将XX拦截功能注册到服务,这个就是要将第一步你注入的拦截器添加到指定的位置

看看我的效果:

AOP拦截日志的更多相关文章
- AOP拦截日志报错llegalStateException: It is illegal to call this method if the current request is not in asynchronous mode
原文链接:https://my.oschina.net/mengzhang6/blog/2395893 关于一次AOP拦截入参记录日志报错的梳理总结 将服务发布到tomcat中后,观察服务的运行状态以 ...
- AOP拦截日志类,抛异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode
AOP的日志拦截类中,抛出异常: java.lang.IllegalStateException: It is illegal to call this method if the current r ...
- 从零开始学 Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- Spring AOP进行日志记录
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
- 运用Unity实现AOP拦截器
运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...
- Spring AOP进行日志记录,管理
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
- spring aop实现日志收集
概述 使用spring aop 来实现日志的统一收集功能 详细 代码下载:http://www.demodashi.com/demo/10185.html 使用spring aop 来实现日志的统一收 ...
- Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- SpringBoot | 第二十四章:日志管理之AOP统一日志
前言 上一章节,介绍了目前开发中常见的log4j2及logback日志框架的整合知识.在很多时候,我们在开发一个系统时,不管出于何种考虑,比如是审计要求,或者防抵赖,还是保留操作痕迹的角度,一般都会有 ...
- [AOP拦截 ]SpringBoot+Quartz Aop拦截Job类中的方法
最近在工作使用boot+quartz整合,开发定时调度平台,遇到需要对Quartz的Job进行异常后将异常记录到日志表的操作,第一反应就想到了使用Spring的AOP,利用AfterThrowin ...
随机推荐
- Go语言学习 _基础04 _Map&Set
Go语言学习 _基础04 _Map&Set 1.map package map_test import ( "fmt" "testing" ) func ...
- Kubernetes上安装nacos
k8s配置 --- apiVersion: apps/v1 kind: Deployment metadata: name: nacos namespace: com spec: selector: ...
- Go语言编写单元测试用例
Go单元测试示例 example/ |--division.go |--division_test.go 为什么被测试文件和测试文件通常放到同一个文件夹下以及同一个声明包里 通常情况下,我们把被测试的 ...
- 5.2 Vi和Vim之间到底有什么关系?
我们知道,Vi 编辑器是 Unix 系统最初的编辑器.它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行.在文件中移动.插入.编辑和替换文本. 尽管 Vi 可能是世界上复杂的编辑器(讨厌它的人 ...
- 一款.NET开源的屏幕实时翻译工具
前言 今天大姚给大家推荐一款.NET开源的屏幕实时翻译工具:Translumo. 工具介绍 Translumo是一个.NET开源的高级屏幕翻译工具,能够实时检测和翻译选定区域内的文本(如字幕).Tra ...
- Minio安装以及使用
Minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器/虚拟机镜像等,而一个对象文 ...
- 实现无感刷新Token技术:.Net Web API与axios的完美结合
这是我之前分享在星球里面的课程,下面整理下,分享下这个无感刷新Token技术方案. 我们都知道Token是有设置有效期的,为了安全都不会设置过长的有效期:但设置有效期太短,又会导致经常需要重新登录. ...
- zinxV0.1
基础的server 框架 抽象层IServer.go IServer.go type IServer interface { // 实现一个服务器的基本三个接口,启动,停止,入口 Start() St ...
- 移动端PDF阅读器重排版效果对比-小白PDF阅读器与KOReader重排效果对比
PDF是一种跨操作系统平台的电子文件格式,它能在各种不同的平台上以相同的版式显示.很多扫描书籍或者电子书籍都会采用PDF格式存储.但是移动端由于屏幕的限制,以原版展示PDF会导致画面缩放严重,影响阅读 ...
- OSG开发笔记(三十七):OSG基于windows平台msvc2017x64编译器官方稳定版本OSG3.4.1搭建环境并移植Demo
前言 自行编译的osg版本插件比较多,如果对版本没有特定要求,但是对环境编译器有特定要求,可以反向融合编译器符合要求的osg版本. OSG下载过程 osg官网:http://www.osg ...