(請注意,它比一個Java問題Bash的問題,請參見下面的註釋)方法來自動檢測錯誤log4j的靜態初始化
當每班配置log4j的,我們做到以下幾點:
public class Example {
private static final Logger log = Logger.getLogger(Example.class);
問題是,我們現在有一箇中等規模的代碼庫(200K LOC),包含大量的Java類和...很多錯誤配置的log4j記錄器。
這是因爲人們(包括我在內,我承認),的確在這有時會導致傻cut'n'paste:
public class Another {
private static final Logger log = Logger.getLogger(Example.class);
與繁榮,而不必Another.class,這是老Example.class這是留下來,因此錯誤地出現在日誌中(因此導致相當多的頭痛)。
我覺得有點奇怪,這種錯誤配置可能會發生,但它可以和我們現在的主要問題不是它可能發生,但我們必須修復錯誤記錄的記錄器。
我們該如何去自動檢測這些? (修復可以是手動的,但我想找一種方式來找到log4j配置錯誤的所有類)。
例如,Bash shell腳本將會非常受歡迎。
- 每一個java文件
- 發現每一個 「類XXX」
- 解析下一個 'X' 線(例如20)
- 是有一個Logger.getLogger(...)線?
- 如果是,它是否與「XXX級」匹配?
- 如果沒有報告
假陽性是不是一個問題,所以它不是如果一些虛假的「類XXX」進行解析的問題等
注意:這個問題確實是我們現在有20萬行代碼,我們希望自動檢測違規(修復可以是手動),所以問題不是類似於:
[是否有更好的方式來獲取當前類變量在Java ? 1
其實它可能更多的是Bash的問題不是一個Java的問題:)的
在這個最歡迎任何幫助。
+1你的方法很有趣。我沒有考慮自動改變類名來使用Factory make方法。不要擔心代碼:Mercurial/hg到處都是,海量的代碼覆蓋,單元測試等。同時,我寫了一些與Denis發佈的內容非常相似的東西,並且它的確行得通。現在我可能會添加工廠並使用您的一個班輪。再一次,不用擔心它是Mercurial :) – SyntaxT3rr0r 2010-01-28 14:56:41