【分享】jfinal使用slf4j作为LogFactory

今天在调试项目的时候,前台报了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());

项目重启,控制台就能看到报错信息了。

评论区

JFinal

2019-10-30 20:16

代码干净利落,就是这么玩的,感谢分享,赞

Succy

2019-10-31 08:46

@JFinal 波总能否把Slf4jLogFactory纳入jfinal呢?现在用logback也挺多的,jfinal默认只有log4j和jdklog

JFinal

2019-10-31 13:02

@Succy 已经写进开发列表了,一直没时间加

加这个需要对原有接口做点改变,添加可变参数支持

amonma

2019-11-01 15:09

使用jenkins部署项目,不打印日志是不是也是这个原因呢

happyboy

2019-11-04 11:18

@amonma 这取决于你用的日志组件是什么,如果用的是log4j默认就能打印,如果不是就得自定义日志工厂声明一下了。

chcode

2019-12-05 21:58

可以使用slf4j 将jdklog桥接到 任何log实现上

JFinal

2019-12-10 21:07

jfinal 4.8 已改进了日志模块:
1: 添加了 trace 日志级别
2: 添加了可变参数系列方法,例如: log.error("参数错误 {} ", para);
3: 添加了 slf4j 实现,配置方法:
me.setToSlf4jLogFactory();

由于 slf4j 是一个日志门面系统,所以使用 slf4j 可以用上很多其它的具体日志实现

建议升级到 jfinal 4.8,很多打磨与改进,谁用谁爽 ^_^

fmpoffice

2021-04-08 15:44

@JFinal 建议以后的demo都写个log.info,我发现没有

热门分享

扫码入社