2017-07-03 124 views
0

我在我的應用程序中使用JUL。通常情況下,Netbeans會打開一個輸出標籤,其中顯示「Tomcat」並顯示我生成的日誌。它工作正常。但突然間,我意識到我的日誌根本沒有顯示,只有System.out得到打印。甚至沒有higgest LOG.log(Level.SEVERE, "....記錄不顯示

} catch(Exception e) { 
     System.out.println("This gets printed in Netbeans tab"); 
     LOG.log(Level.SEVERE, "This doesnt"); 
} 

我懷疑它可能是一個我包括的庫,這是與我的日誌搞亂。這可能嗎? librray能否改變我的日誌顯示方式?我怎麼能調查這一點,因爲我有點失落?

回答

1

我懷疑它可能是我包括的庫,這是我的日誌搞亂。這可能嗎?

是的。 JUL to SLF4J Bridge可以從JUL根記錄器中刪除控制檯處理程序。一些庫調用LogManager.reset可以刪除和關閉所有處理程序。

圖書館可以改變我的日誌顯示方式嗎?

是的。一旦安裝了日誌橋,JUL記錄將不再由JUL格式化程序格式化。

我該如何調查這一點,因爲我有點失落?

修改記錄樹需要的權限,所以你可以安裝所有權限的SecurityManager但隨後打開調試與-Djava.security.debug="access,stack"跟蹤,以確定正在修改記錄儀樹調用者。

如果這不起作用,您可以使用good ole'System.out在加載庫之前和之後打印記錄器樹和附加的處理程序。然後開始添加刪除庫,直到看到記錄器更改。

import java.io.PrintStream; 
import java.util.Enumeration; 
import java.util.logging.Handler; 
import java.util.logging.Level; 
import java.util.logging.LogManager; 
import java.util.logging.Logger; 

public class DebugLogging { 

    private static final Logger log = Logger.getLogger("test"); 

    public static void main(String[] a) { 
     log.log(Level.FINEST, "Finest"); 
     log.log(Level.FINER, "FINER"); 
     log.log(Level.FINE, "FINE"); 
     log.log(Level.CONFIG, "CONFIG"); 
     log.log(Level.INFO, "INFO"); 
     log.log(Level.WARNING, "WARNING"); 
     log.log(Level.SEVERE, "SEVERE"); 
     log.finest("Finest Log"); 
     log.finer("Finer Log"); 
     log.fine("Fine Log"); 
     log.config("Config Log"); 
     log.info("Info Log"); 
     log.warning("Warning Log"); 
     log.severe("Severe Log"); 
     printConfig(System.err); 
    } 

    private static void printConfig(PrintStream ps) { 
     LogManager lm = LogManager.getLogManager(); 
     ps.append("LogManager=").println(lm.getClass().getName()); 
     synchronized (lm) { 
      Enumeration<String> e = lm.getLoggerNames(); 
      while (e.hasMoreElements()) { 
       Logger l = lm.getLogger(e.nextElement()); 
       if (l != null) { 
        print(l, ps); 
       } 
      } 
     } 
    } 

    private static void print(Logger l, PrintStream ps) { 
     String scn = l.getClass().getSimpleName(); 
     ps.append("scn=").append(scn).append(", n=").append(l.getName()) 
       .append(", uph=").append(String.valueOf(l.getUseParentHandlers())) 
       .append(", l=").append(String.valueOf(l.getLevel())) 
       .append(", fl=").println(l.getFilter()); 
     for (Handler h : l.getHandlers()) { 
      ps.append("\t").append(l.getName()).append("->") 
        .append(h.getClass().getName()).append(", h=") 
        .append(String.valueOf(h.getLevel())).append(", fl=") 
        .append(String.valueOf(h.getFilter())).println(); 
     } 
    } 
} 
+0

我一直在嘗試運行此代碼,但我不知道在哪裏。所以我使用加載我的依賴的Maven ...潛在的罪犯是 - Apache Shiro,shiro的擴展和數據庫依賴。但我不確定將它放入我的應用程序中以便在它們加載之前執行 – user1156544

+0

@ user1156544從執行代碼並捕獲結果開始。如果沒有處理程序或級別設置不正確,那就給你一個起點。 – jmehrens

+0

是的,我做到了。我在其中一個類中執行了代碼,結果得到了很多像這樣的打印行...... – user1156544