zoukankan      html  css  js  c++  java
  • Jfinal框架下---com.jfinal.aop配置功能耗时和异常捕获日志

    Jfinal框架下---com.jfinal.aop配置功能耗时和异常捕获日志的原理:

    • 1.在 jfinal  配置类中开启 log4j 日志
    • 2.配置编写 log4j 日志文件
    • 3.在 jfinal  配置类中开启监听器
    • 4.此监听器里面编写 功能耗时 和 异常捕获 日志代码

    依赖jar包:

    1. 在 jfinal  配置类中开启 log4j 日志

    在 extends JFinalConfig 的配置类的 configPlugin() 方法中开启log4j日志

      @Override
        public void configPlugin(Plugins arg0) {
            // 加载log4j日志:后面配置 log4j 文件的路径
            PropertyConfigurator.configure("D:/logfile/log4j.properties");
            
        }

    2.配置编写 log4j 日志文件

    timeAround 和 功能耗时、异常捕获日志 切面类的 日志 一致
    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} [%c]-[%p] %m%n 
    log4j.logger.org.apache.commons=info
    log4j.logger.org.apache.struts=info
    log4j.logger.com.opensymphony.xwork2=info
    log4j.logger.org.springframework=info
    log4j.logger.org.hibernate.ps.PreparedStatementCache=info
    log4j.logger.org.hibernate=info
    
    #info级别日志
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=D:\LogOut\Project\Project.log
    log4j.appender.R.MaxFileSize=200MB
    log4j.appender.R.MaxBackupIndex=10
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[%p] [%l][%t]%n                   u3010%mu3011%n%n 
    
    #error级别日志
    log4j.appender.E=org.apache.log4j.RollingFileAppender
    log4j.appender.E.File=D:\LogOut\Project\error.log
    log4j.appender.E.Threshold= ERROR
    log4j.appender.E.MaxFileSize=200MB
    log4j.appender.E.MaxBackupIndex=50
    log4j.appender.E.layout=org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[%p] [%l][%t]%n                   u3010%mu3011%n%n
    
    #功能耗时、异常捕获日志
    log4j.logger.timeAround=info,timeAround
    log4j.appender.timeAround=org.apache.log4j.RollingFileAppender
    log4j.appender.timeAround.File=D:\LogOut\Project\timeAround.log
    log4j.appender.timeAround.MaxFileSize=200MB
    log4j.appender.timeAround.MaxBackupIndex=10
    log4j.appender.timeAround.layout=org.apache.log4j.PatternLayout
    log4j.appender.timeAround.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[%p] [%l][%t]%n                   u3010%mu3011%n%n 
    log4j.additivity.timeAround=false  ——指定子 log4j.additivity.timeAround 的日志不会出现在 父类 project.log 中,默认是true

    4.在 jfinal  配置类中开启监听器

    在 extends JFinalConfig 的配置类的 configInterceptor() 方法中开启log4j日志

      @Override
        public void configInterceptor(Interceptors me) {
            // 配置拦截器:功能耗时日志和未捕获异常日志
            me.add(new BaseInterceptor());
            
        }

    5.此监听器里面编写 功能耗时 和 异常捕获 日志代码

    参考API:

    https://tool.oschina.net/uploads/apidocs/jfinal/com/jfinal/aop/package-summary.html

    https://tool.oschina.net/uploads/apidocs/jfinal/index.html?com/jfinal/core/ActionInvocation.html

    import java.util.Map;
    import org.apache.log4j.Logger;
    import com.jfinal.aop.Interceptor;
    import com.jfinal.core.ActionInvocation;
    /**
     * @version 创建时间:2020年4月29日下午2:21:00
     * @Description:TODO 功能耗时日志和未捕获异常日志
     */
    public class BaseInterceptor implements Interceptor {
        private static Logger logger = Logger.getLogger(BaseInterceptor.class);
        private static Logger timeAround = Logger.getLogger("timeAround");
        /**
         * <p>Title: intercept</p>
         * @date:2020年4月29日下午2:40:18  
         * @Description:TODO 重写拦截器方法:日志打印功能耗时和未捕获异常
         * <p>Description: </p>   
         * @param ai--
         * @see com.jfinal.aop.Interceptor#intercept(com.jfinal.core.ActionInvocation)
         */
        @Override
        public void intercept(ActionInvocation ai) {
            /**
             * --功能耗时开启
             */
            // 开始时间
            long start = System.currentTimeMillis();
            // java类名:net.jfinal.Action.LoginAction
            String className = ai.getController().getClass().getName();
            // 方法名:login
            String methodName = ai.getMethodName();
            timeAround.info("into action "+className+"."+methodName);
            // 获取所有参数
            Map<String, String[]> parameterMap = ai.getController().getRequest().getParameterMap();
            // 标记第几个参数
            int index = 1;
            // 遍历参数打印到日志
            for (String key : parameterMap.keySet()) {
                String[] params = parameterMap.get(key);
                for (String param : params) {
                    timeAround.info(className+"."+methodName+"	第"+index+"个参数:"+param);
                    index++;
                }
            }
            /**
             * --若Controller层未捕获异常打印到error日志中
             */
            try {
                ai.invoke();
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("BaseInterceptor err", e);
                timeAround.info("BaseInterceptor err", e);
            } 
            //********************捕获异常结束********************\
            timeAround.info(className+"."+methodName+" 执行时间为:"+(System.currentTimeMillis()-start)+"ms");
            //--------------------功能耗时结束--------------------\
        }
        
    }
  • 相关阅读:
    webform 下使用autofac
    AutoFac (控制反转IOC 与依赖注入DI)
    AutoFac使用方法总结:Part I
    Asp.net三种事务处理
    这二十个问题,可能是你技术人生中已经或即将遭遇的痛点,怎么解?
    已经过事务处理的 MSMQ 绑定(转载)
    实践.Net Core在Linux环境下的第一个Hello World
    Linux新手扫盲(转载)
    Redis 数据类型及其特点
    观察者模式深入实践
  • 原文地址:https://www.cnblogs.com/mjtabu/p/12802533.html
Copyright © 2011-2022 走看看