SpringBoot-集成Log4j2

背景


​ 工作过程中一般我们都是接手的项目,可能只注意到怎么使用log4j,没有亲手设置过项目的log4j。本人也是,出于学习的目地,自己亲手试着在SpringBoot的项目中集成了一下log4j2。之于为什么要集成log4j2,本人网上也查了下,主要是:性能提升、自动重载配置

集成


Jar依赖

​ SpringBoot默认集成的日志系统是LogBack,logBack是随着spring-boot-starter-logging引进来的,如图:


image-20200412111852041.png

当然SpringBoot也是支持Log4j2,只需要去掉logback的依赖,引入Log4j2即可。


            org.springframework.boot
            spring-boot-starter-web
            
            
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            


        
            org.springframework.boot
            spring-boot-starter-log4j2
        

如果你需要用到Log4j2的AsyncLogger的异步日志实现方式,还需要引入Disruptor



    com.lmax
    disruptor
    3.4.2

异常说明 如果你的LogBack没有排干净(即被别的系统间接的引入了LogBack的jar),系统会报错,报错信息是很奇怪的

Logging system failed to initialize using configuration from 'classpath:-----.xml'

异常信息是:

ERROR in ch.qos.logback.core.joran.spi.Interpreter@109:47 - no applicable action for [AppenderRef], current ElementPath  is [[configuration][Loggers][AsyncRoot][AppenderRef]]
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
配置文件

​ log4j2一般采用的是xml形式的配置,你需要在在resources目录下新建一个log4j2的配置文件,暂时名称为log4j2.xml。另外还需要在application.properties文件中显示声明才行

logging.config=classpath:log4j2.xml

​ 当然如果不配置logging.config,SpringBoot默认加载的文件名是:log4j2.xml、log4j2-file.xml这两个,在源码:org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadDefaults中:

protected void loadDefaults(LoggingInitializationContext initializationContext,
      LogFile logFile) {
   if (logFile != null) {
      loadConfiguration(getPackagedConfigFile("log4j2-file.xml"), logFile);
   }
   else {
      loadConfiguration(getPackagedConfigFile("log4j2.xml"), logFile);
   }
}

​ 到此SpringBoot集成Log4j2的工作已经完成,可能很多同学跟我一样,也想了解一下log4j2的配置,下面来介绍一下log4j2的日志配置。

Log4j2.xml配置说明







    
        
        
        /data/logs/app
    

    
    

        
        
            
            
            
            
            
            
            

            
            
            
            
        

        
            
        

        
        
        
            
        

        
        
            
                
                
            
            

            
            
                
                
                
                
                
            
            
            
        

    

    

        
        
        
        
                
        
        
        

        
            
            
        

        
        
        
            
            
        

    


异步日志


常用的:root为同步日志输出,AsyncLogger为异步日志。异步日志输出注意三点:

  • 不要同时使用AsyncAppender和AsyncLogger,也就是在配置中不要在配置Appender的时候,使用Async标识的同时,又配置AsyncLogger,这不会报错,但是对于性能提升没有任何好处。

    AsyncAppender是利用java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库

    AsyncLogger是利用Disruptor库实现的,这就是为什么上面需要引用Disruptor的原因。

    尽可能的用:AsyncLogger

  • 不要在开启了全局同步的情况下,仍然使用AsyncAppender和AsyncLogger。这和上一条是同一个意思,也就是说,如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。

    全居配置有两种方式:

    1、在系统初始化的时候,增加全局参数配置

    System.setProperty("log4j2.contextSelector,"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
    

    2、你可以在你第一次获取Logger之前设置,也可以加载JVM启动参数里,类似

    java -Dog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    
  • 如果不是十分必须,不管是同步异步,都设置immediateFlush为false,这会对性能提升有很大帮助。

以上内容有参考:
专门分析了Log4j2的异步日志 https://www.jianshu.com/p/9f0c67facbe2
对log4j2的配置做了详细说明 https://www.jianshu.com/p/d13c2e50a89c

你可能感兴趣的:(SpringBoot-集成Log4j2)