通过注解实现记录日志的功能

使用AspectJ的Aspect、Pointcut、Around实现记录日志功能(拦截自定义注解的方式) 记录:396 场景:实现自定义注解WriteLog,作用在类的方法上,每次执行方法就记录一条日志。使用AspectJ的注解@Aspect、@Pointcut、@Around、@Before、@AfterReturning、@AfterThrowing、@After拦截自定义注解WriteLog,从而完成记录日志功能。 阅读详情

记得以前看spring in action上面介绍AOP的那章,提到了可以用切面来记录系统的日志,实现日志和业务逻辑之间的解耦。

前些日子公司的系统也有了记录日志的需求,遂写了一个通过注解、AOP来实现记录系统日志的功能,以下是实现代码,分享出来大家一起学习,看看有无改进的地方


AOP配置

 <span style="white-space:pre">	</span><bean id="logAspect" class="com.util.LogAspect"/>     
         <aop:config>   
            <aop:aspect ref="logAspect">   
                <aop:pointcut id="logPointCut" expression="execution(* com.service.*.add*(..))||
                execution(* com.service.*.update*(..))"/>   
                <aop:after pointcut-ref="logPointCut" method="doSystemLog"/>   
            </aop:aspect>   
        </aop:config>   

日志处理类


/**
 * 通过Spring AOP来添加系统日志
 */ 
public class LogAspect extends BaseAction{ 
 
    private static final long serialVersionUID = -5063868902693772455L; 
 
    private static String splitParaStr = ",";
    private static String splitNameValueStr = ":";

    @Autowired
	LogServiceImpl logService;
    
    @SuppressWarnings( { "rawtypes", "unchecked" } ) 
    public void doSystemLog(JoinPoint point) throws Throwable {   
        Object[] param = point.getArgs(); 
        Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();

        Method method = null; 
        String methodName = point.getSignature().getName(); 
        
        if (!("set".startsWith(methodName)&&!"get".startsWith(methodName)&&!"query".startsWith(methodName)&&!"sel".startsWith(methodName))){ //不需要记录日志的方法名
            Class targetClass = point.getTarget().getClass();   
            method = targetClass.getMethod(methodName,parameterTypes); 
            if (method != null) { 
                boolean hasAnnotation = method.isAnnotationPresent(com.util.Log.class); 
                if (hasAnnotation) { //判断是否为log的注解
                	com.harmony.lottery.util.Log annotation = method.getAnnotation(com.harmony.lottery.util.Log.class);   
                  //验证是否登录
                	ActionContext actionContext = ActionContext.getContext();
                	if(actionContext == null){
                		return;
                	}
                    Map session = actionContext.getSession();
        			SysUser sysUser=(SysUser) session.get("user");
					if (sysUser != null) {
						com.domain.Log logInfo = new com.domain.Log();
						logInfo.setAddPerson(sysUser.getUserId());
						logInfo.setAddTime(new Date());
						logInfo.setRemark(sysUser.getUserId() + getParamsRemark(annotation,param));//获得注解参数值
						logService.insert(logInfo);
					}   
                }   
            }   
        }   
    } 
     
    /**
     * 通过java反射来从传入的参数object里取出我们需要记录的id,name等属性,
     * 此处我取出的是id
     */ 
    private String getID(Object obj,String param){ 
        if(obj instanceof String){ 
            return obj.toString(); 
        } 
        PropertyDescriptor pd = null; 
        Method method = null; 
        String v = ""; 
        try{ 
            pd = new PropertyDescriptor(param, obj.getClass()); 
            method = pd.getReadMethod();   
            v = String.valueOf(method.invoke(obj));  
        }catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return v; 
    } 
    private String getParamsRemark(com.harmony.lottery.util.Log annotation, Object[] param){
    	String propertys = annotation.propertys();
    	StringBuffer sb = new StringBuffer();
    	if(null != propertys&&!"".equals(propertys)){
    		String[] propertysRemark = annotation.propertys().split(splitParaStr);
        	for (String property : propertysRemark) {//按参数对象属性,取参数值
    			String name = property.split(splitNameValueStr)[0];
    			String value = property.split(splitNameValueStr)[1];
    			sb.append(name + splitNameValueStr + getID(param[0],value) +splitParaStr);
    		}
        	return  annotation.operation()+sb.toString().substring(0,sb.length()-1);
    	}else{
    		String oper = annotation.operation();
    		List<String> list = PatternUtil.getList("\\{(\\d*)\\}",oper);//按参数位置取参数值
    		for (int i=0;i<list.size();i++) {
    			String str = list.get(i);
    			Object obj = param[Integer.parseInt(str)];
    			oper = PatternUtil.replease("\\{"+Integer.parseInt(str)+"\\}", oper, obj.toString());
			}
    		return oper;
    	}
    }
}  

注解接口的定义

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.*;
/**
 * 类的方法描述注解
 * @author LuoYu
 */ 
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
public @interface Log { 
 
    public String operation() default ""; 
    
    public String propertys() default ""; 
} 

具体实现类的配置,其中一个为对象属性的配置方式,一种为参数顺序的配置方式,格式可以根据自己的需要更改


@Log(operation="修改参数-->",propertys="参数名称:name,修改后的值为:value")
	public void update(SysParam record) {
		sysParamMapper.updateByPrimaryKeySelective(record);
}

@Log(operation="为代销商{1}充值{2}元")
<span style="white-space:pre">	</span>public void recharge(String userId,String agencyId,BigDecimal money,int type,Date date,String remark)

AOP:使用自定义注解记录指定方法的操作,实现日志功能 项目情况:         pmdb项目开发过程中需要实现一个操作日志的功能,即将对数据库指定表的增删改查操作进行记录。我采用的是面向切面编程+自定义注解的方式实现的。这种方式的优点是,可以指定哪些方法的操作被记录。         我在开发中遇到的问题是:              1.我们的数据库表是有业务主键的,无法根据数据库命名规则来获取到。(日志记录中需要存入业务主键的值); ... 阅读详情

相关推荐

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

spring AOP自定义注解方式实现日志管理

在项目中需要在特定场合进行记录日志,这里使用 spring AOP 自定义注解方式实现日志管理 如果代码中有注解不明白的地方,欢迎提问。 1、spring 配置文件添加 &lt;!--如果不写proxy-target-class="true"这句话也没问题--&gt; &lt;aop:aspectj-autoproxy proxy-target-class="true"/...

sucre_smile的博客 822

最新版MySQL 9.0 数据库的下载与安装(图文)

本篇文章基于Windows 10 系统下载与安装MySQL 9.0 版本。

我是聂可的博客 7万+

spring AOP实现操作日志记录@OperationLog

表结构设计 两张表,一张记录操作日志,一张记录错误日志。2.创建切面处理类,用于操作日志记录。4.使用示例,在接口上增加注解即可。1.创建一个自定义注解接口。

qq_24138151的博客 1120

BMP280气压传感器原理图设计,已量产(压力传感器)

做嵌入式项目时,“小而精” 的传感器模块永远是刚需 —— 尤其是需要同时测气压和温度的场景,比如无人机定高、环境监测节点、穿戴设备等。最近捣鼓了一款 BMP280 的 Breakout 板,封装做得很紧凑,同时兼顾了稳定性和兼容性,这里单聊硬件设计细节。

不脱发的程序猿 300

射频微波电路设计【1.4】

AppCAD是一组射频设计工具和计算机应用说明,它使射频工程师能以更快和更容易的方式设计他们的产品。该软件的理 念是为工程师提供一个“个人设计助理”,即功能强大、快速和容易使用的辅助设计工具。该软件包括如下基本功能: ·各种传输线电气参数的分析与计算;·各种匹配电路的分析与计算;·各种有源和无源简单电路的分析与计算;·射频系统指标的计算:增益、噪声系数、三阶交调、信噪比、灵敏度等;·器件可靠性分析。

qq_43416206的博客 2324

使用@LogAnnotation注释保存操作记录

1、controller中添加注释 `` @PostMapping(value = “/getXXX/XXX”) @ApiOperation(httpMethod = “POST”) @LogAnnotation(logType=“XXX”,isSaveRequestData=false,isSaveResponseData=false) //添加注释,以及将参数填写其中 public List...

weixin_35442221的博客 8970

前言:为什么要学习爬虫和逆向,该如何学习?

学习爬虫和逆向技术是当今数字化时代的重要技能,尤其在数据分析、安全研究、自动化工具开发等领域有广泛应用。以下是详细的学习理由、路径和方法:

数据知道的博客 1万+

@OperateLog注解 Spring 日志Log

Spring开发中, 1、对于重要的日志数据,需要做持久化处理, 2、日志数据的记录,方便开发人员查看。 添加日志记录的逻辑,只需要在Service层方法上加入@OperateLog注解即可。

wufaqidong1的博客 2853

STM32 HAL PWM (占空比) -电机软启动不到位解决

为了避免电机启动电压大造成设备损坏,或者供电不足导致重启,通常在对启动都需要一个PWM进行软启动,下面对PWM电机软启动详细介绍。

weixin_44597885的博客 867

大模型之Spring AI实战系列(二十一):Spring AI + MCP + 本地文件系统实战指南

在上一篇文章中,我们学习了如何使用 Spring AI 集成 Model Context Protocol (MCP),并通过 Brave Search 实现了互联网搜索能力的接入。本文将继续深入 Spring AI 的 MCP 实战能力,介绍如何将 **本地文件系统** 封装为 LLM 可调用的工具

寻道AI,探索AI无限可能! 2522

java自定义注解

注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。 声明一个注解要用到的东西 修饰符:访问修饰符必须为public,不写默认为pubic 关键字:关键字为@interface 注解名称:注解名称为自定义注解的名称,使用时还会用到 注解类型元素:注解类型元素是注解中内容...

有个疙叫瘩儿的博客 1733

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【注解+aop 记录日志】关于如何使用自定义 @Log 注解实现 Spring AOP 操作日志记录功能的详细教程

📝【SpringAOP+注解实现操作日志教程】 通过自定义@Log注解结合SpringAOP,实现低侵入式操作日志记录。只需在方法上添加注解(如@Log(title="新增用户", businessType=INSERT)),即可自动记录方法参数、返回值、异常等信息,无需手动编码。 🔧 核心实现: 定义@Log注解配置模块名、操作类型等 编写切面类LogAspect,通过@AfterReturning和@AfterThrowing拦截目标方法 利用JoinPoint获取上下文信息(类

alan0721的博客 1068

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring 自定义注解实现操作日志记录功能

需求是这样的:项目很大,有好几个子系统,而且这些子系统已经都在开发过程中了,都进行了大半了。现在要实现的操作日志管理是要将用户在登录系统后所做的重要操作记录下来并查询。记录的内容包括操作人的相关信息(比如:用户ID,用户名,用户IP地址,所属机构等)和所执行的操作的相关信息(比如:所属模块名称、类名、方法名、参数、是否操作成功、描述信息和错误信息)。操作日志查询功能没有什么可说的,难点是在于操作日

先疯盗骨 5240

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

利用AOP+Swagger注解实现日志记录功能

今日接到一个需求,是关于对项目的一个操作记录,想记录所有的增删改查,也就是所有的操作?想想该如何实现呢?首先肯定就想到了spring的AOP。那么如何能够更加页面化呢?如果对于项目中已经使用了swagger,那么利用起来就是一个很好的方式。...

不管风吹浪打,胜似闲庭信步 1328

Spring 注解+AOP实现日志记录功能

注解类上的三个注解称为元注解(),其分别代表的含义如下: @Documented:注解信息会被添加到Java文档中 @Retention:注解的生命周期,表示注解会被保留到什么阶段,可以选择编译阶段、类加载阶段,或运行阶段(). @Target:注解作用的位置,表示该注解仅能作用于方法上 目前注解可以加到方法上,但是并没有任何作用。因为仅仅是声明了注解,下面通过Spring AOP去完善注解的作用。 Spring AOP的基础知识 AOP 术语Spring切面可以应用5种类型的通知 日志记录演示

Carroll的博客 1353

java动态代理详解,并用动态代理和注解实现日志记录功能

动态代理的概念       动态代理是程序在运行过程中自动创建一个代理对象来代替被代理的对象去执行相应的操作,例如, 我们有一个已经投入运行的项目中有一个用户DAO类UserDao用来对User对象进行数据库的增删改查操作,但是有一天,要求在对用户的增删改查操作时记录相应的日志,这是怎么办呢?难道我们去直接修改UserDao的源代码,然后在UserDao的每个方法中加入日志记录功能,这显然是不合

han_han_1的专栏 5682

springboot使用自定义注解实现日志记录功能

有这么一个需求:记录controller的请求参数和响应结果到日志中。 解决思路:写一个自定义注解,在需要记录的controller的方法上,加上该注解,通过注解来记录相关信息。 解决方式:使用AOP来解决,通过返回通知来获取返回结果信息。 解决步骤: 1、在pom.xml中引入AOP的依赖 <dependency> <groupId>...

闲_风的博客 1126

通过AOP+自定义注解实现日志记录功能

Target({ ElementType.PARAMETER, ElementType.METHOD })//表示只能用在方法或者方法的参数上@Retention(RetentionPolicy.RUNTIME)//注解保留在运行时,可以通过反射读取@Documented//注解信息会出现在 Javadoc 中/*** 模块*//*** 功能*//*** 操作人类别*//*** 是否保存请求的参数*//*** 是否保存响应的参数*//**

weixin_65790121的博客 1523

自定义注解实现 AOP 指定 interfice 日志记录功能

工作需求:在已有的项目中 增加操作日志功能, 要求 操作记录详细到 具体字段的修改,可指定具体需要记录的字段。 工作分三步走: 第一,增加自定义注解,确定拦截数据的格式。 第二:增加aop拦截器。 第三:业务代码。 第一,增加自定义注解,确定拦截数据的格式。 1.声明@interface 类 。 2.:声明 注解应用于方法级别 @Target({ElementType.METHOD,ElementType.PARAMETER}) 3.声明 注解 运行时可用 @Reten...

shaochong047的博客 645

通过自定义注解 + aop环绕通知实现记录日志功能

自定义注解+切面类实现记录日志功能

qq_45765384的博客 1313

自定义注解实现 后台系统-记录日志功能

自定义注解实现日志记录

ChanceZhou的博客 1363

Spring Boot 中实现自定义注解记录接口日志功能

Spring Boot 中实现自定义注解记录接口日志功能

编程洪同学 1596

利用Spring AOP自定义注解实现服务层和controller层日志以及异常记录功能

项目开发中我们需要记录各个服务的调用日志,作为审计记录或者供debug查看,或者性能以及使用率分析等等。通过记录日志和异常,我们能找出,哪些功能在哪个时间段被哪些模块调用,入参都有哪些,反应时间多长,这样我们就能比较快的找出项目问题所在或者优化项目。那么如何实现这种功能,Spring AOP给我们提供了现成的方法。 当然实现的方法有很多,最直接的莫过于在每个调用的进入和对出都记录一天日志(log...

russle的专栏 5426
上一篇: mybatis执行两次相同的查询问题
usercore
博客等级 码龄20年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值