本方法主要用于配置修改,完全清理spring boot已經(jīng)去除了spring-boot-starter-log4j2并切換使用logback,打包依然發(fā)現(xiàn)存在log4j相關(guān)包存在的解決辦法。
現(xiàn)階段不建議修改log4j2版本號,首先官方目前2個修復(fù)版本均發(fā)現(xiàn)可以繞過,尚無穩(wěn)定版本,并且各組件還是需要考慮可能兼容等問題。(更新:可以參考臨時方法5直接更新版本號)
背景就不多講了,附臨時修改方法(5選1):
(1). jvm參數(shù) -Dlog4j2.formatMsgNoLookups=true
(2). log4j2.formatMsgNoLookups=True
(3).系統(tǒng)環(huán)境變量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設(shè)置為true
echo FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true >> /etc/profile
source /etc/profile
echo $FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS
log4j2的版本2.10 到 2.14.1 :
echo LOG4J_FORMAT_MSG_NO_LOOKUPS=true >> /etc/profile
source /etc/profile
echo $LOG4J_FORMAT_MSG_NO_LOOKUPS
(4).上waf
(5).直接修改pom引用版本號(打包運行正常即可),多模塊放至最外層pom即可
JDK7升級至2.12.2,>=JDK8升級至2.17.0
<properties>
<log4j2.version>2.17.0</log4j2.version>
</properties>
配置修改方法:直接正題…(當(dāng)然,也可以直接看最后結(jié)論)
1、非spring boot項目可以直接修改版本號解決。
2、spring boot 內(nèi)置默認(rèn)配置了log4j2的版本號,修改log4j2版本號的方法直接不就不建議操作了,首先官方目前2個修復(fù)版本均發(fā)現(xiàn)可以繞過,尚無穩(wěn)定版本,并且各組件還是需要考慮可能兼容等問題。(更新:可以參考臨時方法5直接更新版本號)

3、不要覺得spring boot默認(rèn)使用了logback就萬事大吉。先看看有多少組件使用了log4j
https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/usages?p=1
可以看到常用的jedis,mybatis,druid基本都在用。



但是不要怕,閱讀官方文檔我們可以得知,他們都是按序加載日志組件的,如果都沒有才會導(dǎo)致無日志或者可能異常?;旧霞虞d列表都是這些:
log4j 、log4j2 、 slf4j 、 commons-logging 、 jdklogging
4、所以我們只需要不配置spring-boot-starter-log4j2 使用spring boot 默認(rèn)的logback即可。代碼中使用lombok的@Slf4j 輸出日志即可。
5、但是。。。。
打包spring boot 的jar程序,解壓后會發(fā)現(xiàn)包里面居然還有l(wèi)og4j相關(guān)的api包log4j-api-2.x、log4j-to-slf4j、log4j-core(路徑:\BOOT-INF\lib)



6、結(jié)論:為了保險起見我們需要屏蔽log4j的相關(guān)依賴
(1)、取消項目中使用spring-boot-starter-log4j2配置
(2)、使用spring boot 默認(rèn)的logback日志組件,無需單獨引用。
(3)、代碼中使用@Slf4j 輸出日志
(4)、保險起見:屏蔽log4j2的其他組件引用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
SpringCloud直接最外層pom排除即可
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclude>
<exclude>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclude>
<exclude>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
(5)、重新打包,運行日志輸出正常,部署完成。
PS:這個是目前代碼方法之一,建議先臨時上緊急方法,然后評估成本修改代碼方法。修改后,再觀望官方推薦方法,畢竟目前還沒有一個穩(wěn)定的修復(fù)版本,最后應(yīng)該會有一個比較達(dá)成共識的最終方法。