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

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  
View Code

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();
            }
        }
}
View Code

 

转载于:https://www.cnblogs.com/skyislimit/p/6221560.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值