在项目中我们可以同spring 的aop来统一处理日志,避免了很多重复代码,配置如下:
spring 中配置:
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 系统服务组件的切面Bean -->
<bean id="aspectService" class="com.gm.yanshang.yanshang_project.common.AspectService"></bean>
<!-- AOP配置 -->
<aop:config>
<!-- 声明一个切面,并注入切面Bean,相当于@Aspect -->
<aop:aspect id="simpleAspect" ref="aspectService">
<!-- 配置一个切入点,相当于@Pointcut -->
<aop:pointcut expression="execution(* com.gm.yanshang.yanshang_project..*(..))" id="simplePointcut"/>
<aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
</aop:aspect>
</aop:config>
下面是log增强类的处理:
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class AspectService implements ThrowsAdvice
{
Logger logger=Logger.getLogger(AspectService.class);
//配置抛出异常后通知,使用在方法aspect()上注册的切入点
public void afterThrow(JoinPoint joinPoint, Exception ex){
logger.info("进入切面AfterThrowing方法中...");
//判断日志输出级别
if(logger.isInfoEnabled()){
logger.info("afterThrow " + joinPoint + "\t" + ex.getMessage());
}
//详细错误信息
String errorMsg = "";
StackTraceElement[] trace = ex.getStackTrace();
for (StackTraceElement s : trace) {
errorMsg += "\tat " + s + "\r\n";
}
//写入异常日志
writeLog(errorMsg,joinPoint,ex);
}
/**
*
* @param detailErrMsg 详细错误信息
* @param method 方法名称
* @Description: 日志异常
*/
public void writeLog(String detailErrMsg,JoinPoint joinPoint,Exception ex){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.
getRequestAttributes()).getRequest();
//获取请求的URL
StringBuffer requestURL = request.getRequestURL();
//获取参 数信息
String queryString = request.getQueryString();
//封装完整请求URL带参数
if(queryString != null){
requestURL .append("?").append(queryString);
}
String cla=joinPoint.getTarget().getClass().getName();//action
String method=joinPoint.getSignature().getName();//method
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//日志具体参数
StringBuffer sb=new StringBuffer();
sb.append("-----------"+sdf.format(new Date())+"------------\r\n");
sb.append("远程请求URL["+requestURL+"]\r\n");
sb.append("接口方法:["+cla+"."+method+"]\r\n");
sb.append("详细错误信息:"+ex+"\r\n");
sb.append(detailErrMsg+"\r\n");
logger.info(sb);
}
}
这样所有异常日志都会被拦截到log中。