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"); //--------------------功能耗时结束--------------------\ } }