在多個Jar(Zip)文件查找Log4J配置文件的Shell命令行

在多個Jar(Zip)文件查找Log4J配置文件的Shell命令行

by 李 鼎 on 七月 5th, 2012

開發時會碰到

  • 爲什麼沒有期望的日誌輸出
  • 生效的日誌配置文件是哪個

的問題,就要排查Lib目錄下哪個Jar文件中有log4j.xml或是log4j.properties配置文件(log4j.xml文件優於log4j.properties生效)。理想情況是隻會有一個log4j配置文件,實際上常常在二方庫中也有。

然後看看裏面的配置,必要的時候要刪除或是修改。

實現一:


find -iname '*.jar' | while read jarfile
do
        jar tf $jarfile | grep 'log4j\.properties\|log4j\.xml' | while read item
        do
                echo "$jarfile"\!"$item"
        done
done

即用Find命令找出Jar文件,用jar命令list中Jar中文件名,grep到log4j.properties後,輸出成


path/to/file.jar!path/to/log4j.properties

的格式,jar文件和jar裏面的文件用!分隔。

這裏使用jar tf來列出Jar文件中的文件名,也可以使用unzip –l命令。Jar文件即是Zip格式。

但是zip -l列出的輸出格式是


$ unzip -l foo.jar
Archive:  foo.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2012-01-11 18:55   META-INF/
      571  2012-01-11 18:55   META-INF/MANIFEST.MF
        0  2012-01-11 18:55   META-INF/maven/
      165  2012-01-11 18:55   META-INF/INDEX.LIST
......
---------                     -------
     3430                     8 files

我還沒有找到不輸出頭和尾信息的選項。這裏要組合一些命令來去了。

實現二:


find -iname '*.jar' -exec sh -c \
    'jar tf $0 | grep 'log4j\.properties\|log4j\.xml' | xargs -r printf "$0!%s\n"' {} \;

輸出和實現一相同,要短一些,但可讀性差些。

這個實現有些潛在的問題:(上面的實現一中沒有這些問題)

  • 如果Jar文件中grep的文件名很多,printf命令就會因參數過多而執行失敗了。
  • 如何Jar文件名中包含如 %s, printf命令的輸出就不對了(需要完整的轉義)

後話:

可以把實現做成腳本,加上腳本參數,方便複用執行,如:把要找的Jar文件名模式,在Jar文件的文件夾,Jar文件裏要查找文件名的模式,等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章