log4j升级为log4j2(不需要改动代码)

公司的项目决定升级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:

  1. They must not access methods and classes internal to the Log4j 1.x implementation such as Appenders, LoggerRepository or Category's callAppendersmethod.
  2. They must not programmatically configure Log4j.
  3. They must not configure by calling the classes DOMConfigurator or PropertyConfigurator

第一步:我这里是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

1、 sfl4j整合log4j2

    		  
		 
		 
		    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:

UTF-8

 
maven-compiler-plugin

1.6
1.6
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

你可能感兴趣的:(log4j)