Tomcat重復請求,log4j2日志重復顯示問題排查

2019年1月8日10:12:18 發表評論 5,702 ℃

前提:

公司項目用的是nginx+tomcat+java,線上環境和線下環境版本配置都是一樣,采用的是jenkins自動化部署。

問題:

前段時間突然發現瀏覽器訪問一個頁面,后端日志會出現重復的兩條日志記錄一模一樣,請求時間都是一樣的,經過測試發現所有的請求都會有兩條重復的日志記錄。如下圖:

Tomcat重復請求,log4j2日志重復顯示問題排查

排查:

1、一開始認為是前端重復請求了,查看nginx訪問日志,發現刷新一次頁面的確nginx會出現兩條請求記錄,一次是OPTIONS請求,一次是GET請求,但是監控tomcat日志,發現刷新一次頁面有4次請求,兩次完全相同(包括時間)的OPTIONS和兩次完全相同的GET請求。

2、排除前端頁面問題以后,開始懷疑是nginx重復請求導致,于是直接通過IP+tomcat端口訪問,發現還是會有完全一模一樣的兩條日志。然后通過IP+端口測試其他幾個后端api,都會出現一樣的問題。

3、排查nginx和前端以后,把問題鎖定在了tomcat環境上面,于是開始一步一步排查:

a、對比了線上和線下的tomcat版本、java版本以及diff對比了線上和線下的實例配置文件,都是完全一樣的。

b、百度搜索以后,有網友說重復請求問題是因為在tomcat的默認的server.xml里面,錯誤的配置了Host或者Context標簽導致兩個對象同時持有日志文件,導致重復加載。

①如果新增了Host,那Host/appBase的值是不能和其他Host/appBase的值一樣的。比如appBase都是webapps,那么兩個Host會導致webapps下面的工程被加載兩遍。

②如果配置了Context標簽那么就一定要配置name屬性值為:工程名(/web-sys),或者配置path值為工程名(/web-sys),否則就會引起重復加載工程的問題。

③<Alias>標簽,允許我們把多個域名配置在一個Host下面,例如:xxx.com、xxx.cn、xxx.com.cn,都可以配置在一個Host下面

需要配置成下面這樣:

<Host name="www.xxx.com" appBase="mywebapps" autoDeploy="true" unpackWARs="true">

<Alias>www.xxx.cn</Alias> 

<Alias>www.xxx.com.cn</Alias> 

<Context docBase="web-sys" path="" name="/web-sys"/>

</Host>

我對比了我的server.xml文件,于是添加了name屬性,然后刪除了默認的ROOT目錄,進行了一番測試,結果還是會出現顯示兩條重復日志的問題。

4、經過上面的排查以后,開始有點迷茫,于是把線上的實例war包直接拷貝到了本地環境,然后修改了數據庫信息,經測試還是會有同樣的問題。此時瞬間又找到了方向,應該是war包封裝過程中的問題。

5、于是去查看jenkins 線上和線下構建過程,發現配置文件有個redis參數不一樣、log4j2.xml日志級別不一樣,swagger開啟狀態不一樣,然后馬上把新建一個實例,把jenkins構建過程改成和本地測試環境一樣,重新構建部署到生產環境,訪問測試終于正常了。

6、這次終于找到了原因,于是依次對上面幾個不同的參數一個一個修改發布測試,最后發現是因為log4j2.xml里面少了additivity="false"這個屬性導致。(一旦一個日志輸出到一個Logger,這個Logger的additivity設置為false,那么這個日志不會再繼續向父Logger進行傳遞,忽略其他Logger的additivity的設置。)

7、最后再去排查為何會少一個屬性,才發現是jenkins構建過程中,使用sed命令替換時,使用了.*通配符去替換日志等級level="DEBUG",導致把additivity="false"替換為了空。

 <Logger name="cn.amd5.community" level="DEBUG" additivity="false">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="DailyLogFile"/>

</Logger>

加上additivity="false"以后,重啟實例,測試正常,如下圖:

Tomcat重復請求,log4j2日志重復顯示問題排查

【騰訊云】云服務器、云數據庫、COS、CDN、短信等云產品特惠熱賣中

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: