<!-- 操作日志切面声明 -->
<bean id="logAspect" class="com.tq365.service.sys.log.SystemLogAspect"/>
<aop:config>
<aop:aspect ref="logAspect">
</aop:aspect>
</aop:config>
Java代码:
/**
* 系统操作日志切面
*
* @author archie2010
* since 2011-3-17 下午02:44:03
*/
@Aspect
publicclass SystemLogAspect {
// int与long之Class会自动转为其封装类型之Class
privatestaticfinal String integerClazz ="class java.lang.Integer";
privatestaticfinal String longClazz ="class java.lang.Long";
@Resource
private SystemLogService systemLogService;
private Logger logger = Logger.getLogger(this.getClass().getName());
@Pointcut("execution(* com.tq365.service..*.*(..))")
publicvoid myAspect() {
};
@AfterThrowing(pointcut ="myAspect()", throwing ="e")
publicvoid doAfterThrowing(JoinPoint jp, Throwable e) {
System.out.println("出现异常:"+ e.getMessage());
System.out.println(e.getClass().getName());
System.out.println("异常所在类:"+ jp.getTarget().getClass().getName());
System.out.println(""+ jp.getSignature().getName()
+"方法 throw exception");
// logger.error("错误! error级别的!!!"+e.getMessage());
logger.error("Oops==="+ jp.getTarget().getClass().getName() +"中的"
+ jp.getSignature().getName() +"方法抛出"+ e.getClass().getName()
+"异常");
System.out.println("参数:");
;
if (jp.getArgs() !=null&& jp.getArgs().length >0) {
for (int i =0; i < jp.getArgs().length; i++) {
System.out.println(jp.getArgs()[i].toString());
logger.error("参数:--"+ jp.getArgs()[i].toString());
}
}
}
@SuppressWarnings("unchecked")
@After("@annotation(com.tq365.sys.annotation.SystemLogAnnotation)")
publicvoid doAfter(JoinPoint jp) {
System.out.println("----------后置通知");
System.out.println("方法所在类:"+ jp.getTarget().getClass().getName());
System.out.println(""+ jp.getSignature().getName() +"方法");
String methodName = jp.getSignature().getName();
// 操作日志对象-----------------
SystemLog sysLog =new SystemLog();
// 操作参数-----------------
String descArgs ="参数";
if (jp.getArgs() !=null&& jp.getArgs().length >0) {
for (int i =0; i < jp.getArgs().length; i++) {
if(jp.getArgs()[i]!=null){
//System.out.println(jp.getArgs()[i].toString());
descArgs += jp.getArgs()[i].toString()+",";
}else{
descArgs +="null"+",";
}
}
System.out.println("------参数"+ descArgs);
}
sysLog.setOperateArgs(descArgs);
String des =null;//方法描述
if (!(methodName.startsWith("set") || methodName.startsWith("get"))) {
Class targetClass = jp.getTarget().getClass();
//方法不定向参数Clazz...
Class[] claszs =new Class[jp.getArgs().length];
for (int i =0; i < jp.getArgs().length; i++) {
//System.out.println(jp.getArgs()[i]);
if(jp.getArgs()[i]!=null){
System.out.println(jp.getArgs()[i].getClass());
if (jp.getArgs()[i].getClass().toString().equals(integerClazz)) {
claszs[i] =int.class;
} elseif (jp.getArgs()[i].getClass().toString().equals(
longClazz)) {
claszs[i] =long.class;
}else{
claszs[i] =jp.getArgs()[i].getClass();
}
}elseif(jp.getArgs()[i]==null){
claszs[i] = String.class;
}
}
Method method=null;
try {
method = targetClass.getMethod(methodName, claszs);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
//若方法为空(描述无法获得则des=null)
if(method!=null){
System.out.println(method.getAnnotation(SystemLogAnnotation.class)
.description());
des = method.getAnnotation(SystemLogAnnotation.class).description();
}
}
// 获得Session
HttpSession session = ServletActionContext.getRequest().getSession();
// 取到当前的操作用户
User appUser = (User) session.getAttribute("USER");
if (appUser !=null) {
System.out.println("用户已经存在Session中");
// 操作日志对象
sysLog.setUid(appUser.getUserId());
sysLog.setUsername(appUser.getFullName());
}
HttpServletRequest request = ServletActionContext.getRequest();
String ip = request.getRemoteAddr();
sysLog.setOperateTime(DateUtil.getCurrentTime());
sysLog.setOperateDes(methodName +"->"+ des);
sysLog.setIp(ip);
systemLogService.save(sysLog);
System.out.println("----------保存操作日志");
}
}
相关推荐
spring AOP 切面日志 分层打日志
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
spring aop做的日志管理,网上看的,没测试过。
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
springaop拦截controller日志
spring aop jar 包
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
Spring AOP--日志管理,注释齐全,欢迎大家共同交流。
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
Spring mvc mybatis plus 实现AOP 切面日志系统,带有数据库。可以自行拓展
采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo
swagger和spring Aop日志结合 ,swagger和spring Aop日志结合 ,swagger和spring Aop日志结合 ,
spring aop的demo spring aop的demo
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
Spring aop Spring aop