2015-11-05 37 views
0

我已經按照以下方式在許多子類引用的根類中創建了一個通用記錄器。如何在使用常用記錄器時禁用某些類的日誌記錄?

public static final Logger LOGGER = Logger.getLogger(RootClass.class.getName()); 

然後我按照以下方式訪問該子類中的記錄器。

private static final Logger LOGGER = RootClass.LOGGER; 

我有一個主要類從用戶接收輸入,它調用RootClass中的一個方法來配置記錄器。

logStatus = messageBus.configureLogPath(logPath,logLevel); 

以下是上述方法的實現。

public Boolean configureLogPath(String logPath,String level) { 
    Boolean result=false; 
    switch(level) { 
     case "info" : 
      LOGGER.setLevel(Level.INFO); 
      break; 
     case "severe": 
      LOGGER.setLevel(Level.SEVERE); 
      break; 
     case "debug": 
      LOGGER.setLevel(Level.CONFIG); 
      break; 
     case "off" : 
      LOGGER.setLevel(Level.OFF); 
      break; 
     default : 
      LOGGER.setLevel(Level.SEVERE); 
    } 
    try { 
     simpleFormatter = new SimpleFormatter(); 
     logFileHandler = new FileHandler(logPath); 
     logFileHandler.setFormatter(simpleFormatter); 


     LOGGER.addHandler(logFileHandler); 
     result =true; 
    } catch (SecurityException e1) { 
     result= false; 
     LOGGER.log(Level.SEVERE, "Security exception when reading log file" + e1); 
    } catch (IOException e1) { 
     result = false; 
     LOGGER.log(Level.SEVERE, "IO Exception when reading log file" + e1); 
    } 
    return result; 
} 

我可以禁用某些選定的子類的日誌記錄嗎?我有一個要求,用戶應該能夠設置日誌應該創建的某些子類。但是因爲我在所有的孩子班中都使用了一個通用記錄器,所以我不確定如何實現這一點。請指教。

回答

1

爲了滿足您的要求,您必須創建一個自定義log filter,檢查source class name並將其安裝在根記錄器上。

public class SourceFilter implements Filter { 

    @Override 
    public boolean isLoggable(LogRecord record) { 
     //Source class can return null so handle it. 
     String cn = String.valueOf(record.getSourceClassName()); 
     return !cn.startsWith("foo.bar.Child1") 
       && !cn.startsWith("foo.bar.Child2") 
       && !cn.startsWith("foo.bar.Child3"); 
    } 
} 

此外,一級類有一個parse方法,你可以用它來擺脫switch語句。

0

如果一切都失敗了,你總是可以走動調用堆棧,看看你的函數從哪裏調用。也許不是最有效的解決方案,但它應該適用於您的情況。

+0

我需要一種方法來關閉某些類的日誌,因爲這是確切的要求:( – mayooran

0

我們可以提到從特定的Java類註銷如下面的代碼:

Logger.getLogger( 「cs.fid.tm.reportingService.config.test1」)setLevel(Level.OFF);

+0

我不能用它來關閉子類的日誌,因爲這些子類正在使用根類的記錄器。當我在這些類中使用通用記錄器時要這麼做?我不得不使用通用記錄器,因爲我需要將所有類的輸出都放到一個日誌文件中。 – mayooran