zoukankan      html  css  js  c++  java
  • 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("
    ");
                }
                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
  • 相关阅读:
    我的一些JAVA基础见解
    我的三天前端世界
    「SAP技术」 SAP MM MPN物料的采购初探
    被 GANs 虐千百遍后,我总结出来的 10 条训练经验
    解析|人脸识别最全知识图谱—清华大学出品
    AI反欺诈:千亿的蓝海,烫手的山芋|甲子光年
    从《华为的冬天》到AI的冬天 | 甲子光年
    「杂谈」苏州要想成为一线城市,还需要放几个大招
    「杂谈」最有可能成为第五个一线城市,苏州 or 杭州?
    「杂谈」我眼里的2019年度新一线城市排名
  • 原文地址:https://www.cnblogs.com/skyislimit/p/6221560.html
Copyright © 2011-2022 走看看