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 ...
随机推荐
- KubeSphere 社区双周报|2024.09.13-09.26
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeKey 升级 Kubernetes 次要版本实战指南
作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...
- NeuVector 会是下一个爆款云原生安全神器吗?
近日一则<SUSE 发布 NeuVector:业内首个开源容器安全平台>的文章被转载于各大 IT 新闻网站.作为 SUSE 家族的新进成员,在 3 个月后便履行了开源承诺,着实让人赞叹.那 ...
- 向AWS迁移系统
向AWS迁移系统的考虑事项: 1.理解现在应用的架构和运行环境: 使用的OS,软件版本,依赖库,底层硬件,数据库,资源使用用量.性能等非功能要件. 基于这些信息设计在AWS上的架构,使用Ins ...
- Docker Compose容器编排--项目五
一.Docker Compose概念 Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排(Orchestration ...
- WebDriver常用属性和方法
除了上一篇的元素定位方法,Selenium中的WebDriver类中还有一些常用的属性和方法 一.常用的属性 1.下表列出了WebDriver的常用属性 # 属性 属性描述 用途 1 driver.n ...
- 历史性突破:独立开发 .net core 在线客服系统累计处理聊天消息 48 万余条!
业余时间用 .net core 写了一个在线客服系统.我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享. 后来我索性就发了一个100%私有化版直接 ...
- 关于 IntelliJ IDEA 2024 安装使用 (附加激活码、补丁,亲测有效)
第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接 也可以在这里点击下载idea https://pan.quar ...
- CSP-S模拟赛20241004
A 你考虑 可以把这个数组当中的每个数表示成另一种形式:\(a_i = k_i\times x+b\)(其中\(x\)是模数,\(b\)为余数). 对于求两个数是否对于某个余数同余,显然你要判断他们两 ...
- Java基础语法闪过——纯小白
Java语法突击 笔者因为学校奇葩选课原因,需要学习Java,考试所迫和大伙一起交流复习下基础的语法内容,大家都一把拿下考试 观前提醒:本文整理的有些仓促了,简单几分钟看看Java有什么内容还好,如果 ...