2017-07-03 130 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