Java日志系统之Log4j2

Log4j2介绍

Log4j2是Log4j的升级版,参考Logback的优秀设计并修复了一些问题。主要优点有:

  • 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
  • 性能提升,log4j2相较于log4j和logback都具有很明显的性能提升。
  • 自动重载配置,参考了logback的设计,会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
  • 无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvmgc。

Log4j2的简单使用

Log4j2和Slf4j一样,既可以当门户也可以当日志实现。但是通常都是用Slf4j当门户,Log4j2当日志实现。先单独使用Log4j2进行日志打印

    
        
        
            org.apache.logging.log4j
            log4j-api
            2.19.0
        
        
        
            org.apache.logging.log4j
            log4j-core
            2.19.0
        

        
            junit
            junit
            4.12
        
    
public class TestLog4j2 {
    public  final static Logger logger = LogManager.getLogger(TestLog4j2.class);

    @Test
    public void testLog() throws Exception {
        logger.fatal("fatal");
        logger.error("error");
        logger.warn("wring");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
    }
}

20:05:28.830 [main] FATAL com.zmt.TestLog4j2 - fatal

20:05:28.831 [main] ERROR com.zmt.TestLog4j2 - error

可以看出,Log4j2的默认级别为error。

接下来使用Slf4j与Log4j2混合使用。

只需要在pom文件中添加slf4j-api与log4j-slf4j-impl依赖就好。其余什么都不用改变。

  	
        
            org.slf4j
            slf4j-api
            2.0.7
        

        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.13.3
        

        
            junit
            junit
            4.12
        
    

Log4j2的配置文件

log4j2默认加载classpath路径下的log4j2.xml文件




    
        
    
    
    
        
        
            
        
        
        
            
        

        
        
            
        
        
        
            
            
            
            
            
                
                
                
                
                
                
            
            
            
        
    

    
    
        
        
            
            
            
        
    

Log4j2异步日志

异步日志分为三种:

  • AsyncAppender:异步Appender
  • 全局AsyncLogger:全局异步Logger
  • 混合AsyncLogger:异步与同步混合使用的Logger

其中异步Appender的性能最差,基本不使用。

全局异步Logger性能最好,但是有时并不是所有的业务都需要异步记录日志,因此也不常用。

通常使用混合AsyncLogger。

异步Appender简单实现

在xml配置文件中Appenders标签下添加配置

  	
        
        
            
        
        
        
            
        
      	
				
            
        
    

    
    
        
        
            
            
            
        
    
public class TestLog4j2 {
    public  final static Logger logger = LogManager.getLogger(TestLog4j2.class);

    @Test
    public void testLog() throws Exception {
        logger.fatal("fatal");
        logger.error("error");
        logger.warn("wring");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
    }
}

观察日志文件

Java日志系统之Log4j2_第1张图片

全局异步Logger简单实现

只需要在resource目录下创建文件名为log4j.component.properties添加如下配置

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

log4j2.xml配置文件不需要做任何改动。

混和异步Logger简单实现

如果使用混合异步Logger,需要将全局异步Logger的配置文件注释或删除,并且需要添加依赖。

        
            com.lmax
            disruptor
            3.4.4
        

在log4j.xml文件中进行修改

    
    
        
        
        
            
        


        
        
            
            
            
        
    

观察控制台输出

Java日志系统之Log4j2_第2张图片

可以看到,即使日志格式中添加了%L但仍不会再控制台中打印行号

注意:

  • 如果使用异步日志AysncAppender、AsyncLogger与全局日志不要同时出现,性能会和最差的一致
  • 设置includeLocation为false是必要的,打印位置信息会降低异步日志的性能,比同步日志还慢。

Log4j2的无垃圾模式

其他日志系统在记录日志时会分配临时对象,如日志事件对象、字符串、字符数组等,当临时对象过多时会触发JVM的gc操作(该操作会暂停程序的运行)。而Log4j2从2.6版本开始,默认情况下以无垃圾模式运行,主要原理是重用对象和缓冲区,尽可能的不分配临时对象。

你可能感兴趣的:(java,log4j,单元测试)