今天在调试项目的时候,前台报了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());
项目重启,控制台就能看到报错信息了。
 
 
 
 
 
 
 
