[置顶] 使用sping AOP 操作日志管理
记录后台操作人员的登陆、退出、进入了哪个界面、增加、删除、修改等操作
在数据库中建立一张SYSLOG表,使用Sping 的AOP实现日志管理,在Sping.xml中配置
<!-- spring 获取配置文件中定义的bean -->
<aop:aspectj-autoproxy proxy-target-class="true"/><!-- 开启切面编程功能 -->
<context:component-scan base-package="com.geeboo.wxbus.service.impl,com.geeboo.wxbus.interceptor"/>
<context:annotation-config/>
然后在interceptor包下创建一个MyInterceptor类,里面有anyMethod ()。doBefore(),doAfterReturning(),doAfterThrowing(),
doAfter(),doAround()等方法。
在doAround()中执行判断用户进行进入那个类并且那个方法,然后添加日志记录。
// 调用方法名称
String methodName =pjp.getSignature().getName();
//获取进入的类名
StringclassName=
pjp.getSignature().getDeclaringTypeName();
className =
className.substring(className.lastIndexOf(".") 1).trim();
- package com.geeboo.wxbus.interceptor;
- import java.lang.reflect.Field;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.UUID;
- import java.util.regex.Pattern;
- import net.sf.json.JSONObject;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- import org.jeecgframework.core.util.ContextHolderUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import com.geeboo.wxbus.entity.FeedbackInfo;
- import com.geeboo.wxbus.entity.SnackCollect;
- import com.geeboo.wxbus.entity.SysLog;
- import com.geeboo.wxbus.entity.Tuser;
- import com.geeboo.wxbus.entity.UserSuggest;
- import com.geeboo.wxbus.pageModel.FeedbackInfoPage;
- import com.geeboo.wxbus.pageModel.SnackCollectPage;
- import com.geeboo.wxbus.pageModel.User;
- import com.geeboo.wxbus.pageModel.UserSuggestPage;
- import com.geeboo.wxbus.service.FeedbackInfoServiceI;
- import com.geeboo.wxbus.service.SnackCollectServiceI;
- import com.geeboo.wxbus.service.SysLogServiceI;
- import com.geeboo.wxbus.service.UserServiceI;
- import com.geeboo.wxbus.service.UserSuggestServiceI;
- @Aspect
- @Component
- public class MyInterceptor {
- private SysLogServiceI logServiceI;//日志
- private UserServiceI userService;//用户
- private FeedbackInfoServiceI feedbackInfoService;//反馈
- private SnackCollectServiceI snackCollectService;//商店
- private UserSuggestServiceI userSuggestService;//用户建议
- public UserServiceI getUserService() {
- return userService;
- }
- @Autowired
- public void setUserService(UserServiceI userService) {
- this.userService = userService;
- }
- public FeedbackInfoServiceI getFeedbackInfoService() {
- return feedbackInfoService;
- }
- @Autowired
- public void setFeedbackInfoService(FeedbackInfoServiceI feedbackInfoService) {
- this.feedbackInfoService = feedbackInfoService;
- }
- public SnackCollectServiceI getSnackCollectService() {
- return snackCollectService;
- }
- @Autowired
- public void setSnackCollectService(SnackCollectServiceI snackCollectService) {
- this.snackCollectService = snackCollectService;
- }
- public UserSuggestServiceI getUserSuggestService() {
- return userSuggestService;
- }
- @Autowired
- public void setUserSuggestService(UserSuggestServiceI userSuggestService) {
- this.userSuggestService = userSuggestService;
- }
- public SysLogServiceI getLogServiceI() {
- return logServiceI;
- }
- @Autowired
- public void setLogServiceI(SysLogServiceI logServiceI) {
- this.logServiceI = logServiceI;
- }
- /**
- * 第一个* 代表任意的返回类型 (..) 所有参数
- */
- @Pointcut("execution(* com.geeboo.wxbus.service.impl.*.*(..))")
- private void anyMethod() {
- }; // 声明一个切入点
- @Before("anyMethod() && args(object)")
- public void doBefore(Object object) {
- //System.out.println("前置通知" + object);
- }
- @AfterReturning(pointcut = "anyMethod()", returning = "name")
- public void doAfterReturning(String name) {
- //System.out.println("后置通知:" + name);
- }
- @AfterThrowing("anyMethod()")
- public void doAfterThrowing() {
- //System.out.println("例外通知");
- }
- @After("anyMethod() && args(object)" )
- public void doAfter(Object object) {
- //System.out.println("最终通知"+object);
- }
- @Around("anyMethod()")
- public Object doAround(ProceedingJoinPoint pjp) throws Throwable { // 要执行pip.proceed方法
- // 调用方法名称
- String methodName = pjp.getSignature().getName();
- //获取进入的类名
- String className = pjp.getSignature().getDeclaringTypeName();
- className = className.substring(className.lastIndexOf(".") + 1).trim();
- if(className.equals("SysLogServiceImpl")||className.equals("TotalMsgServiceImpl")||className.equals("TotalUserServiceImpl")||className.equals("MessageServiceImpl")){ //如果是日志的就不用
- return pjp.proceed();
- }
- // 调用参数
- Object[] args = pjp.getArgs();
- Object object = null;
- // System.out.println("==============进去的方法"+methodName);
- if(Pattern.matches("(add|update|delete)[\\S]*",
- methodName)) {
- String logMsg="";//日志消息内容
- Tuser user=(Tuser) ContextHolderUtils.getSession().getAttribute("USER_SESSION");//获取用户名
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String time=sdf.format(new Date());//获取当前时间
- //System.out.println("进入的类名"+className);
- JSONObject msg = new JSONObject();
- for (Object temp : args) {
- Class<? extends Object> paramClazz = temp.getClass();
- String classType = paramClazz.getName();
- if (classType.equals("java.lang.String")) {
- msg.put("key", temp);
- } else if (classType.equals("java.util.HashMap")) {
- msg.putAll((HashMap<?, ?>) temp);
- } else if (classType.startsWith("com.")) {
- try {
- Field[] f = paramClazz.getDeclaredFields();
- for (Field field : f) {
- String fieldName = field.getName();
- field.setAccessible(true);
- msg.put(fieldName, field.get(temp));
- }
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- }
- }
- }
- //用户管理
- if(className.equals("UserServiceImpl")){
- if(user!=null){
- logMsg="用户名:"+user.getCname()+"-在-"+"操作用户";
- }else{
- logMsg="";
- }
- JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
- if(methodName.equals("update")){ //修改之前获取原来的数据
- User u=new User();
- u.setCid(msg.getString("cid").toString());//获取删除的主键
- Tuser lastUser=userService.get(u);
- msg1.put("user", lastUser);
- logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
- }else if(methodName.equals("delete")){
- User u=new User();
- u.setCid(msg.getString("key").toString());//获取删除的主键
- Tuser lastUser=userService.get(u);
- msg1.put("user", lastUser);
- logMsg=logMsg+"-进入删除操作值为:"+msg1;
- }
- }
- //反馈管理
- else if(className.equals("FeedbackInfoServiceImpl")){
- logMsg=user.getCname()+"-在-"+"操作反馈信息";
- JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
- if(methodName.equals("update")){ //进入修改界面
- FeedbackInfoPage f=new FeedbackInfoPage();
- //System.out.println("反馈信息"+msg);
- f.setFeedbackId(msg.getString("feedbackId"));
- FeedbackInfo lastFeebackInfo=feedbackInfoService.get(f);
- msg1.put("feebackInfo", lastFeebackInfo);
- }else if(methodName.equals("delete")){
- FeedbackInfoPage f=new FeedbackInfoPage();
- //System.out.println("反馈信息"+msg);
- f.setFeedbackId(msg.getString("key"));
- FeedbackInfo lastFeebackInfo=feedbackInfoService.get(f);
- msg1.put("feebackInfo", lastFeebackInfo);
- }
- if(methodName.equals("update")){
- logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
- }else if(methodName.equals("delete")){
- logMsg=logMsg+"-进入删除操作值为:"+msg1;
- }
- }
- //用户建议管理
- else if(className.equals("UserSuggestServiceImpl")){
- logMsg=user.getCname()+"-在-"+"操作用户建议";
- JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
- if(methodName.equals("delete")){
- UserSuggestPage suggest=new UserSuggestPage();
- //System.out.println("用户建议"+msg);
- suggest.setSuggestId(msg.getString("key"));
- UserSuggest lastSuggest=userSuggestService.get(suggest);
- msg1.put("suggest", lastSuggest);
- logMsg=logMsg+"-进入删除操作值为:"+msg1;
- }
- }
- //店家管理
- else if(className.equals("SnackCollectServiceImpl")){
- logMsg=user.getCname()+"-在-"+"操作商店";
- JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
- if(methodName.equals("update")){
- SnackCollectPage snackCollect=new SnackCollectPage();
- //System.out.println("店家管理"+msg);
- snackCollect.setSnackCollectId(msg.getString("snackCollectId"));
- SnackCollect lastSnack=snackCollectService.get(snackCollect);
- msg1.put("snack", lastSnack);
- logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
- //System.out.println("店家管理修改后的数据"+logMsg);
- }else if(methodName.equals("delete")){
- SnackCollectPage snackCollect=new SnackCollectPage();
- //System.out.println("店家管理"+msg);
- snackCollect.setSnackCollectId(msg.getString("key"));
- SnackCollect lastSnack=snackCollectService.get(snackCollect);
- msg1.put("snack", lastSnack);
- logMsg=logMsg+"-进入删除操作值为:"+msg1;
- }
- }
- if(methodName.equals("add")){ //进入获取添加方法
- logMsg=logMsg+"-进入添加操作值为:"+msg;
- }
- SysLog log=new SysLog();
- log.setLogId(UUID.randomUUID().toString());
- log.setLogMsg(logMsg);
- log.setLogTime(time);
- logServiceI.add(log);
- }
- return pjp.proceed();
- }
- }
相关推荐
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,比如日志、事务管理、性能监控等。在本项目中,我们将深入探讨如何利用Spring AOP进行日志管理...
采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo
下面将详细介绍如何在Spring框架中使用AOP来实现日志记载。 1. **AOP基本概念** - **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它结合了业务逻辑与横切关注点。 - **通知(Advice)**:通知...
在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题...
在IT行业中,Spring框架是Java开发中的一个基石,尤其在企业级应用开发中扮演着重要角色。Spring AOP(Aspect ...通过运行这些测试,我们可以看到AOP日志功能的实际效果,并学习如何在自己的项目中应用这些概念。
AOP是面向对象编程(OOP)的一种补充,它关注的是“横切关注点”,比如日志、事务管理、安全检查等,这些关注点通常会横跨多个对象。在Spring中,切面由两个主要部分组成:切点(Pointcut)和通知(Advice)。切点...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...
在IT行业中,Spring框架是Java开发中的核心工具之一,它为开发者提供了许多强大的功能...在提供的"aopLog-demo"项目中,你可以找到更多关于Spring AOP日志管理的实际应用示例,这将有助于你进一步理解和实践这一技术。
要使用Spring AOP,通常需要引入以下几个核心的Jar包: 1. **aspectj-1.7.3.jar**:这是AspectJ库的核心部分,提供了AOP语言支持,包括AspectJ编译器和运行时库。AspectJ是Java平台上的一个开源项目,它扩展了Java...
在Spring AOP(面向切面编程)中实现日志分析管理是一种常见的做法,它能帮助开发者跟踪和理解系统运行过程中的行为,同时提供详细的错误日志以支持运维工作。通过元注解的方式,我们可以轻松地将日志记录功能集成到...
总的来说,Spring AOP通过代理和通知机制,实现了横切关注点的模块化,使得业务逻辑与系统服务(如日志、事务等)解耦,提高了代码的可读性和可维护性。同时,引介功能进一步增强了切面的功能,可以为对象动态地添加...
本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect和注解实现这一功能。 首先,我们要理解Spring AOP的基本概念。AOP是面向对象编程(OOP)的一种补充,它专注于处理那些横向的、与业务逻辑无关...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
将Swagger和Spring AOP结合起来,我们可以在API调用时自动记录日志,这有助于跟踪API的使用情况、性能和错误。以下是一个简单的步骤来实现这一目标: 1. 引入依赖:在项目中添加Swagger和Spring AOP的相关依赖,如`...
本文将深入探讨如何使用Flex与Spring框架整合,实现AOP(面向切面编程)来达到日志管理的目标。AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解...