在已开发完的项目中添加日志,使用切面比较方便,下述即为AOP+Log4j记录项目中日志的方法。
1.添加log4j.properties
log4j.rootLogger=INFO,A1,R,E
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../log/Logs.log
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.Threshold=ERROR
log4j.appender.E.File=../log/Errors.log
log4j.appender.E.DatePattern='.'yyyy-MM-dd
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %l %m%n
log4j的详细配置可参考:
Log4J日志配置详解、
log4j详细配置文件
2.新建LogInterceptor.java
public class LogInterceptor{
private final Logger logger = Logger.getLogger(LogInterceptor.class);//log4j
/**
* 前置方法,在目标方法执行前执行
*/
public void before(JoinPoint joinPoint){
Map<String,String> map = ParameterUtil.getParameters();
String methodName = joinPoint.getSignature().getName();
String entity = joinPoint.getTarget().getClass().getName();
logger.info("start! "+entity+"."+methodName+" data:"+map.toString());
}
/**
* 后置方法,在目标方法执行后执行
*/
/* public void after(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
String entity = joinPoint.getTarget().getClass().getName();
logger.info("end! "+entity+"."+methodName);
}*/
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
String methodName = proceedingJoinPoint.getSignature().getName();
String entity = proceedingJoinPoint.getTarget().getClass().getName();
Object result =null;
try {
result = proceedingJoinPoint.proceed();
} catch (Exception ex) {
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
//获取请求的URL
StringBuffer requestURL = request.getRequestURL();
//获取参 数信息
String queryString = request.getQueryString();
//封装完整请求URL带参数
if(queryString != null){
requestURL .append("?").append(queryString);
}
String errorMsg = "";
StackTraceElement[] trace = ex.getStackTrace();
for (StackTraceElement s : trace) {
errorMsg += "\tat " + s + "\r\n";
}
StringBuffer sb=new StringBuffer();
sb.append("frontend-exception!!!\r\n");
sb.append(" 请求URL:"+requestURL+"\r\n");
sb.append(" 方法:"+entity+"."+methodName+"\r\n");
sb.append(" 详细错误信息:"+ex+"\r\n");
sb.append(errorMsg+"\r\n");
logger.error(sb.toString());
}
return result;
}
}
3.配置bean.xml
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- 将日志类注入到bean中 -->
<bean id="logInterceptor" class="com.intercepter.LogInterceptor" />
<aop:config>
<aop:aspect id="logAspect" ref="logInterceptor">
<aop:pointcut expression="execution(* com.test..*.*(..))" id="logPointCut"/>
<aop:before method="before" pointcut-ref="logPointCut"/>
<!-- <aop:after method="after" pointcut-ref="logPointCut" /> -->
<!-- <aop:after-throwing method="afterThrow" pointcut-ref="logPointCut" throwing="ex"/> -->
<aop:around method="around" pointcut-ref="logPointCut" />
</aop:aspect>
</aop:config>
4.在具体类中,有异常时,直接抛出即可,AOP会catch到并处理记录。
注解方法可参考:spring aop 切面记录log4j日志