2013-03-17 64 views
0

我有兩個我想跟蹤的公共方法。其中一種方法反覆調用其他方法。我想要做的只是跟蹤從外部調用的方法。動態跳過日誌消息

這裏有一個簡單的類來證明我的意思:

public class LoggingExample { 
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); 
    public static final String USER_ROOT = "/home/waisbrot"; 

    /** could be called by fileExistsRobust *or* from outside */ 
    public static boolean fileExists(String filename) { 
     logger.trace("Checking for file {}", filename); 
     File f = new File(filename); 
     return f.exists(); 
    } 

    /** always gets called from outside */ 
    public static boolean fileExistsRobust(String filename) { 
     logger.trace("Checking for any varient of {}", filename); 
     if (fileExists(filename)) 
      return true; 
     for (String prefix : prefixes) { // this list is 100 items long 
      if (fileExists(prefix + filename)); 
       return true; 
     } 
     return false; 
    } 
} 

其他地方在我的代碼,我可以稱之爲fileExists,在這種情況下,我想獲得印刷其日誌消息(假設我跟蹤它) 。但是如果我打電話fileExistsRobost比我想日誌消息,而不是fileExists

我想跟蹤這兩種方法,但是當我打電話給第二個時,我會被埋在輸出中。我希望Logback可以被配置來理解我想要的,但是我沒有看到任何有用的文檔。當我輸入fileExistsRobust然後在fileExists中測試它時,我可以翻轉一個標誌,但是在多個線程中這會變得很難看(因爲這些是靜態方法),並且它似乎開始用大量日誌記錄基礎設施來污染該類。我可以使用MDC來存儲信息,但這似乎是濫用MDC。

之前有人遇到過這種情況嗎?你是怎麼處理的?

回答

1

我認爲你可以改變代碼。然後,在我看來,最簡單的方式是通過與一家伐木的toogle引入另一internalFileExists(String filename)或超載FILEEXISTS(字符串文件名),避免了問題:

public static boolean fileExists(String filename, boolean doLog) { 
    if (doLog) logger.trace("Checking for file {}", filename); 
    File f = new File(filename); 
    return f.exists(); 
} 

,讓fileExistsRobust使用重載版本doLog =假,而唯一的參數版本重定向到fileExists(文件名,true)。

這並沒有真正解決問題,但緩解了它。

+0

我喜歡你首先提到的私人內部解決方案。 – 2013-03-19 01:44:55