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