AOP 采用异常通知切入,把指定包的异常记录到日志文件。
先看log4j.properties ,控制台输出的是普通信息, 文件输出的是异常信息。
log4j.rootLogger=DEBUG, Console
log4j.logger.com.java1234.aop=error,appender1
#file E:/temp/test.txt E:\temp\test.txt
log4j.appender.appender1=org.apache.log4j.FileAppender
log4j.appender.appender1.File=E:/temp/test.txt
log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
spring 配置文件中要记得加入AOP扫描注解,并且把需要切入的类交给spring控制。
<!-- 自动扫描 --> <context:component-scan base-package="com.java1234" /> <!-- AOP XML配置 --> <!-- <bean id="helloBean" class="com.java1234.aop.HelloAspectBean"> </bean> <aop:config> <aop:pointcut id="servicePoint" expression="within(com.java1234.service.impl.*)"/> <aop:aspect ref="helloBean"> <aop:before method="helloMethod" pointcut-ref="servicePoint"/> </aop:aspect> </aop:config> --> <!-- AOP注解配置 --> <!-- 开启AOP注解配置@Aspect,@Pointcut,@Before等 --> <aop:aspectj-autoproxy proxy-target-class="true"/>
重点来了,异常通知的切入方法怎么写。
import org.apache.log4j.Logger; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect//指定为方面 public class HandlerExceptionBean { Logger logger = Logger.getLogger(HandlerExceptionBean.class); //采用异常通知切入,目标Service抛出异常给ex参数 @AfterThrowing(throwing="ex",pointcut="within(com.java1234.service.impl.*)") public void exceptionMethod(Exception ex){ //将ex信息写入日志文件error.log logger.error("发生异常,异常类型:"+ex); StackTraceElement[] st = ex.getStackTrace(); StringBuilder msg = new StringBuilder(); for(StackTraceElement s : st){ msg.append(s); msg.append(" "); } logger.error(msg); } }
如果不用log4j,也可以只用AOP把异常写到指定文件,参考下面代码。
@Component @Aspect//指定为方面 public class HandlerExceptionBean { //采用异常通知切入,目标Service抛出异常给ex参数@AfterThrowing(throwing="ex",pointcut="within(org.tarena.note.web.controller..*)") public void exceptionMethod(Exception ex){ // 将ex信息写入日志文件error.log String file="E:\temp\error.log"; try { FileWriter out = new FileWriter(file,true); PrintWriter pw=new PrintWriter(out); ex.printStackTrace(pw); pw.flush(); pw.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }