今天在调试项目的时候,前台报了500错误,但是后台却没有任何错误日志,debug调试后发现代码走到了com.jfinal.core.ActionHandler,日志输出是这么处理的。
catch (RenderException e) { if (log.isErrorEnabled()) { String qs = request.getQueryString(); log.error(qs == null ? target : target + "?" + qs, e); } }
问题就在这里了,jfinal默认使用的是log4j作为日志工厂,但是我的项目使用的却是slf4j+log4j2的形式。
下面直接上解决方案,参考Log4jLog以及Log4jLogFactory写两个类似的类。
Slf4jLog.java
package core.log; import com.jfinal.log.Log; public class Slf4jLog extends Log { private org.slf4j.Logger log; Slf4jLog(Class<?> clazz) { log = org.slf4j.LoggerFactory.getLogger(clazz); } Slf4jLog(String name) { log = org.slf4j.LoggerFactory.getLogger(name); } @Override public void debug(String message) { log.debug(message); } @Override public void debug(String message, Throwable t) { log.debug(message, t); } @Override public void info(String message) { log.info(message); } @Override public void info(String message, Throwable t) { log.info(message, t); } @Override public void warn(String message) { log.warn(message); } @Override public void warn(String message, Throwable t) { log.warn(message, t); } @Override public void error(String message) { log.error(message); } @Override public void error(String message, Throwable t) { log.error(message, t); } @Override public void fatal(String message) { // TODO Auto-generated method stub } @Override public void fatal(String message, Throwable t) { // TODO Auto-generated method stub } @Override public boolean isDebugEnabled() { return log.isDebugEnabled(); } @Override public boolean isInfoEnabled() { return log.isInfoEnabled(); } @Override public boolean isWarnEnabled() { return log.isWarnEnabled(); } @Override public boolean isErrorEnabled() { return log.isErrorEnabled(); } @Override public boolean isFatalEnabled() { return false; } }
Slf4jLogFactory.java
package core.log; import com.jfinal.log.ILogFactory; import com.jfinal.log.Log; public class Slf4jLogFactory implements ILogFactory{ @Override public Log getLog(Class<?> clazz) { return new Slf4jLog(clazz); } @Override public Log getLog(String name) { return new Slf4jLog(name); } }
然后,最后声明一下:
me.setLogFactory(new Slf4jLogFactory());
项目重启,控制台就能看到报错信息了。