使用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" />这样我们的日志记录功能就完成了