spring boot 使用log4j2做日志打印,并在配置文件中引用pom变量的解决

笔者最近创建了一个新的spring boot 工程,项目要发布到测试环境用docker来跑,日志需要输出到指定目录映射出来查看,就想着配置一下log。

 

引入log4j2

首先介绍如何引入log4j2,spring boot 不做修改默认使用的是logback,性能不如log4j2优秀,所以我们换成log4j2。

我们要在pom中先将默认的logging(里面用的Logbak)包排除,排除的方法有很多,由于笔者采用分模块打包的形式,所有项目有一个根pom,我选择在根pom的 dependencyManagement 依赖管理中排除这个包


    
        
            org.springframework.boot
            spring-boot-starter
            2.2.6.RELEASE
            
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            
        
    

如此一来,子模块引入的spring-boot-starter里面都不包含spring-boot-starter-logging的

然后我们在需要打印log的模块中引入spring-boot-starter-log4j2就可以了


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

配置log4j2

引入后,spring-boot-starter-log4j2会有默认的配置,然后笔者的需求是修改日志打印的路径,所以要修改其配置文件

我们在resources目录下创建log4j2-spring.xml,注意这样命名是为了spring可以自动加载我们的配置文件,当前你也可以随便起名字,那就需要你在application.yml配置中指定你的配置文件名

logging:
  config: 你的配置文件名

个人比较喜欢它原生的日志格式,想在它默认配置下只修改文件目录,于是在 spring-boot这个jar包里面的org.springframework.boot.logging.log4j2下找到默认配置log4j2.xml



	
		%xwEx
		%5p
		yyyy-MM-dd HH:mm:ss.SSS
		%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
		%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
	
	
		
			
		
	
	
		
		
		
		
		
		
		
		
		
			
		
	

只需要在里面增加文件配置就可以了,修改后的文件如下



	
		${project.name}
        /mnt/logs/${project.name}/${hostName}
		%xwEx
		%5p
		yyyy-MM-dd HH:mm:ss.SSS
		%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
		%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
	
	
		
			
		
        
            
            
            
            
            
                
                
                    
                    
                
            
        
	
	
		
		
		
		
		
		
		
		
		
			
			
		
	

引入pom变量

在模块多的情况下,笔者不想每个文件都要改,于是引用了pom里面的变量project.name,如果不做任何配置,会把这两个变量当成字符串,然后真的打到${project.name}目录下面

接下来我们解决这个问题

spring boot 2.0 默认的变量符号是@变量名@,我们将它改成${变量名},在pom文件build节点下引入maven-resource-plugin,然后设置useDefaultDelimiters = true,变量的符号就变成了${}


    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
        
            org.apache.maven.plugins
            maven-resources-plugin
            
                UTF-8
                true
            
        
    

这样配置完后,笔者发现打包完成后的xml文件中,变量并没有被替换掉,还是${}的形式,还需要增加以下配置


    
        
            src/main/resources
            true
        
    
    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
        
            org.apache.maven.plugins
            maven-resources-plugin
            
                UTF-8
                true
            
        
    

再次打包,project.name已经打入xml文件中了。(hostName会在运行时加入系统变量中,所以这个打完包仍然是${hostName},不影响最终的日志输出目录)

至于为什么在配置中增加了resource目录的过滤就好了,也许是这样才能在打包时处理一遍这个目录(猜的),希望有懂的大佬交流一下。

你可能感兴趣的:(Java,spring,java,log4j2)