【问题标题】:Logging not showing日志不显示
【发布时间】:2017-12-06 13:11:53
【问题描述】:

我在我的应用程序中使用 JUL。通常,Netbeans 会打开一个输出选项卡,其中显示“Tomcat”并显示我生成的日志。它工作正常。但突然间,我意识到我的日志根本没有显示,只有System.out 被打印出来。甚至不是最高的LOG.log(Level.SEVERE, "....

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

我怀疑它可能是我包含的一个库,它弄乱了我的日志。这有可能吗?图书馆可以改变我的日志的显示方式吗?由于我有点迷茫,我该如何调查?

【问题讨论】:

    标签: java logging netbeans java.util.logging


    【解决方案1】:

    我怀疑它可能是我包含的一个库,它弄乱了我的日志。这可能吗?

    是的。 JUL to SLF4J Bridge 可以从 JUL 根记录器中删除控制台处理程序。一些库调用 LogManager.reset 可以删除和关闭所有处理程序。

    图书馆可以改变我的日志的显示方式吗?

    是的。一旦安装了日志桥,JUL 记录就不再被 JUL 格式化程序格式化。

    由于我有点迷茫,我该如何调查?

    修改记录器树需要权限,因此您可以安装具有所有权限的SecurityManager,然后使用-Djava.security.debug="access,stack" 打开调试跟踪以确定正在修改记录器树的调用者。

    如果这不起作用,您可以使用 good ole' System.out 在加载库之前和之后打印记录器树和附加的处理程序。然后开始添加删除库,直到您看到记录器发生变化。

    import java.io.File;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    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) {
            String cname = System.getProperty("java.util.logging.config.class");
            if (cname != null) {
                try {
                    ClassLoader sys = ClassLoader.getSystemClassLoader();
                    Class<?> c = Class.forName(cname, false, sys);
                    ps.println(sys.getClass().getName() +" found log configuration class " + c.getName());
                } catch (LinkageError | ClassNotFoundException | RuntimeException cnfe) {
                    ps.println("Unable to load " + cname);
                    cnfe.printStackTrace(ps);
                }
            } else {
                ps.println("java.util.logging.config.class was null");
            }
            
            String file = System.getProperty("java.util.logging.config.file");
            if (file != null) {
               ps.println("java.util.logging.config.file=" + file);
               try {
                   ps.println("CanonicalPath=" + new File(file).getCanonicalPath());
               } catch (RuntimeException | IOException ioe) {
                   ps.println("Unable to resolve path for " + file);
                   ioe.printStackTrace(ps);
               }
    
               try {
                   Path p = Paths.get(file);
                   if (Files.isReadable(p)) {
                       ps.println(file + " is readable and has size " + Files.size(p));
                   } else {
                       if (Files.exists(p)) {
                           ps.println(file + " exists for " + System.getProperty("user.name") + " but is not readable.");
                       } else {
                           ps.println(file + " doesn't exist for " + System.getProperty("user.name"));
                       }
                   }
               } catch (RuntimeException | IOException ioe) {
                   ps.println("Unable to read " + file);
                   ioe.printStackTrace(ps);
               }
            } else {
                ps.println("java.util.logging.config.file was null");
            }
    
            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();
            }
        }
    }
    

    【讨论】:

    • 我一直在尝试运行这段代码,但我不确定在哪里。所以我正在使用 Maven 来加载我的依赖项......潜在的违规者是 - Apache Shiro,以及 shiro 的扩展和数据库依赖项。但我不确定在加载之前将其放在我的应用程序中要执行的位置
    • @user1156544 从让代码执行并捕获结果开始。如果没有处理程序或级别设置不正确,则可以为您提供一个起点。
    • 是的,我做到了。我在我的一个类中执行了代码,结果是很多这样的打印行......
    • @user1156544 该输出显示根记录器上没有安装控制台处理程序。这就是您看不到控制台输出的原因。要么它从未被添加,要么被某些东西删除。
    • Yes. 你最好的办法是使用我的答案中的SecurityManager 步骤,并尝试找出正在删除处理程序的调用者。您也可以尝试调用 LogManager.readConfiguration() 来撤消程序配置更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2017-08-29
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多