使用AOP进行日志记录
我们应该首先思考使用哪一种类型的通知?切入点应该选在哪?
这是我们使用AOP编程必须思考的东西。
在这里
操作日志我采用了环绕通知类型(@Around)
错误日志我采用了异常通知类型(@AfterThrowing)
需要引入lib
commons-logging.jar
spring.jar
aspectjrt.jar
aspectjweaver.jar
cglib-nodep-2.*.*.jar
操作日志:
package com.scsk.common; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionMapping; import org.apache.struts2.ServletActionContext; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import com.opensymphony.xwork2.ActionContext; @Aspect public class OptLogger { @Around("execution(* com.scsk.*.web.action.*.*(..))") public Object loggerOpt(ProceedingJoinPoint pjp) throws Throwable { // 获取要执行的方法名和目标对象类型 String methodName = pjp.getSignature().getName(); String clazzName = pjp.getTarget().getClass().getSimpleName(); System.out.println("========= 操作日志记录 ========="); //这里使用了struts2的ActionContext,可以 方便的取出Session中的操作用户信息 Map<String,Object> session = (Map<String,Object>)ActionContext.getContext().getSession(); username = (String) session.get("username"); //后台打印,如果需要写入数据库,编写相应代码就可以完成操作了 System.out.println("Time:" + new Date().toString()); System.out.println("User:" + username); System.out.println("Class:" + clazzName); System.out.println("Method:" + methodName); // 调用目标对象的方法 Object retVal = pjp.proceed(); return retVal; } }
错误日志
package com.scsk.common; import java.io.IOException; import java.util.Date; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; @Aspect public class ExceptionLogger { @AfterThrowing(pointcut = "execution(* com.scsk.*.web.action.*.*(..))", throwing = "ex") public void loggerException(Exception ex) { System.out.println("========= 异常错误记录 ========="); System.out.println("Time:" + new Date().toString()); System.out.println("Msg:" + ex.toString()); } }
在spring配置文件中如下配置:
<bean id="exLogger" class="com.scsk.common.ExceptionLogger"></bean> <bean id="optLogger" class="com.scsk.common.OptLogger"></bean> <aop:aspectj-autoproxy proxy-target-class="true" />这样我们的日志记录功能就完成了