JFinal 使用log4j2打印日志

作者:じ☆ve宝贝

发布时间:2018-05-21T14:25:13

现在很多框架使用log4j2作为日志框架,近期在jfinal项目使用es的jar包时,发现没有办法打印日志,故将jfinal日志框架改为log4j2

pom.xml 中引入相关jar包

<properties>
	<!-- log4j日志文件管理包版本 -->
	<slf4j.version>1.7.21</slf4j.version>
	<log4j2.version>2.8.2</log4j2.version>
</properties>

<dependencies>

	<!--添加SLF4J-JCL依赖,将对JCL的日志API调用转换为对SLF4J接口的调用 -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jcl-over-slf4j</artifactId>
		<version>${slf4j.version}</version>
	</dependency>

	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>${log4j2.version}</version>
	</dependency>

	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-api</artifactId>
		<version>${log4j2.version}</version>
	</dependency>

	<!-- 桥接:告诉commons logging使用Log4j2 -->
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-jcl</artifactId>
		<version>${log4j2.version}</version>
	</dependency>
	<!-- 桥接:告诉Java Util Logging使用Log4j2 -->
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-jul</artifactId>
		<version>${log4j2.version}</version>
	</dependency>

	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>${log4j2.version}</version>
	</dependency>

</dependencies>

实现jfinal的 ILogFactory

import com.jfinal.log.ILogFactory;
import com.jfinal.log.Log;

public class Slf4jLogFactory implements ILogFactory {

	@Override
	public Log getLog(Class<?> clazz) {
		return new Slf4jLogger(clazz);
	}

	@Override
	public Log getLog(String name) {
		return new Slf4jLogger(name);
	}
}

集成jfinal的 Log

import org.slf4j.LoggerFactory;
import com.jfinal.log.Log;

public class Slf4jLogger extends Log {

	private org.slf4j.Logger log;

	Slf4jLogger(Class<?> clazz) {
		log = LoggerFactory.getLogger(clazz);
	}

	Slf4jLogger(String name) {
		log = LoggerFactory.getLogger(name);
	}

	public void info(String message) {
		log.info(message);
	}

	public void info(String message, Throwable t) {
		log.info(message, t);
	}

	public void debug(String message) {
		log.debug(message);
	}

	public void debug(String message, Throwable t) {
		log.debug(message, t);
	}

	public void warn(String message) {
		log.warn(message);
	}

	public void warn(String message, Throwable t) {
		log.warn(message, t);
	}

	public void error(String message) {
		log.error(message);
	}

	public void error(String message, Throwable t) {
		log.error(message, t);
	}

	public void fatal(String message) {
		log.error(message);
	}

	public void fatal(String message, Throwable t) {
		log.error(message, t);
	}

	public boolean isDebugEnabled() {
		return log.isDebugEnabled();
	}

	public boolean isInfoEnabled() {
		return log.isInfoEnabled();
	}

	public boolean isWarnEnabled() {
		return log.isWarnEnabled();
	}

	public boolean isErrorEnabled() {
		return log.isErrorEnabled();
	}

	public boolean isFatalEnabled() {
		return log.isErrorEnabled();
	}
}

指定Jfinal默认加载的log框架

在继承JFinalConfig的类中找到 configConstant方法

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		me.setLogFactory(new Slf4jLogFactory());
		// 加载少量必要配置,随后可用PropKit.get(...)获取值
		PropKit.use("config.properties");
		me.setDevMode(PropKit.getBoolean("devMode", false));
	}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,
     你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
     600s 刷新此配置
-->
<Configuration status="WARN" monitorInterval="600">
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT" ignoreExceptions="false">
			<PatternLayout
				pattern="%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n" />
		</Console>
	</Appenders>

	<Loggers>
		<logger name="org.mybatis" level="debug" additivity="true" />
		<Root level="info">
			<AppenderRef ref="Console" />
		</Root>
	</Loggers>
</Configuration>

这样配置完成后你的日志框架已经成功切换为log4j2了