公司的项目决定升级log4j,因为log4j2有一个自动删除日志的功能,这样可以减轻运维的一些工作,而且在多线程环境下,log4j2的异步日志系统比log4j和logback提高了十倍的性能(吞吐量和延迟率),官方原文如下:
Log4j 2 contains next-generation Asynchronous Loggers based on the LMAX Disruptor library. In multi-threaded scenarios Asynchronous Loggers have 10 times higher throughput and orders of magnitude lower latency than Log4j 1.x and Logback.
因为是升级,原项目用的是log4j或者self4j打印日志,获取logger的方式不同
比如log4j:
import org.apache.log4j.Logger;
private static final Logger LOGGER = Logger.getLogger(xxxx.class);
比如self4j:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(xxxx.class);
而如果用log4j2的话,API将有所不同:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(xxxx.class);
而如果是commons-logging,API将是:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static final Log log = LogFactory.getLog(XXX.class);
如果在升级的过程中,我们要去改代码的话,那将是一项很大的繁琐工程,log4j2架构已经考虑到这一点,给我们提供了转换的包,我们只需要导入几个转换包就可以使用log4j2,而且还不需要修改代码。
官方原文:
Perhaps the simplest way to convert to using Log4j 2 is to replace the log4j 1.x jar file with Log4j 2's log4j-1.2-api.jar. However, to use this successfully applications must meet the following requirements:
第一步:我这里是maven项目,就以maven项目为例子,进行讲解
所需版本及jar:
jar包
|
版本
|
备注
|
---|---|---|
slf4j-api |
1.7.2 |
jcl-over-slf4j 也需要统一使用 1.7.2 版本 |
log4j-slf4j-impl |
2.3 |
|
log4j-api |
2.3 |
|
log4j-core |
2.3 |
|
log4j-1.2-api |
2.3 |
需清理jar:
需删除jar包
|
说明
|
---|---|
slf4j-log4j12 | slf4j到log4j1的桥接包 |
slf4j-jdk14 |
slf4j到java.util.logging的桥接包 |
log4j-to-slf4j | 将log4j2的接口适配到slf4j上,不能和log4j-slf4j-impl同时存在 |
slf4j-jcl |
将slf4j适配到JCL上 |
logback-classic | 将slf4j适配到logback上 |
slf4j-simple | 一个简单桥接实现 |
jar包
|
版本
|
备注
|
---|---|---|
slf4j-api |
1.7.2 |
jcl-over-slf4j 也需要统一使用 1.7.2 版本 |
log4j-slf4j-impl |
2.3 |
|
log4j-api |
2.3 |
|
log4j-core |
2.3 |
|
log4j-1.2-api |
2.3 |
org.apache.logging.log4j
log4j-api
2.3
org.apache.logging.log4j
log4j-core
2.3
org.slf4j
slf4j-api
1.7.2
org.apache.logging.log4j
log4j-slf4j-impl
2.3
org.apache.logging.log4j
log4j-web
2.4.1
runtime
2、log4j整合log4j2
org.apache.logging.log4j
log4j-1.2-api
2.3
org.apache.logging.log4j
log4j-api
2.3
org.apache.logging.log4j
log4j-core
2.3
org.apache.logging.log4j
log4j-web
2.4.1
runtime
3、commons-logging与log4j2集成(commons-logging是日志接口,根据底层使用的log插件进行日志输出)
commons-logging
commons-logging
1.2
org.apache.logging.log4j
log4j-api
2.3
org.apache.logging.log4j
log4j-1.2-api
2.3
org.apache.logging.log4j
log4j-core
2.3
org.apache.logging.log4j
log4j-web
2.3
第二步:删掉以前的log4j.properties,改为log4j2.xml,这里起名字的时候,不要写错了
如果编译后中文乱码可设置编码为UTF-8:
/data/logs/jboss/
uleWalletEjb
web项目serlet2.5需要添加如下配置
log4jConfiguration
classpath:log4j2.xml
org.apache.logging.log4j.web.Log4jServletContextListener
log4jServletFilter
org.apache.logging.log4j.web.Log4jServletFilter
log4jServletFilter
/*
REQUEST
FORWARD
INCLUDE
ERROR
log4jConfiguration可以不配置默认去classpath去找log4j2.xml
导入log4j-web依赖后 如果main方法运行测试日志打印可能控制台不输出日志原因是因为该依赖包中的log4j2.component.properties配置文件中配置了
log4j.shutdownHookEnabled=false 及主线程提前运行完并没有使用shutdownHook来关闭loggerContext所以一些日志不知打印那里去了,
web项目默认是关闭的因为是通过ServletContextListener的contextDestroyed方法关闭loggerContext的
非web项目没有这种问题
查看文章:
https://my.oschina.net/pingpangkuangmo/blog/410224
http://blog.csdn.net/zouxucong/article/details/56005725
http://blog.csdn.net/zouxucong/article/details/56013053