log4j+AOP 记录错误日志信息到文件中

时间:2023-03-08 15:42:25

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"/>

applicationContext.xml

重点来了,异常通知的切入方法怎么写。

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("\n");
}
logger.error(msg);
}
}

HandlerExceptionBean

如果不用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();
}
}
}