java.util.logging.Logger不尊重java.util.logging.Level?

在普通的Java SE 6环境中:

Logger l = Logger.getLogger("nameless"); l.setLevel(Level.ALL); l.fine("somemessage"); 

Eclipse控制台中没有显示任何内容。 l.info(“”)及以上版本运行良好,但低于罚款似乎不起作用。 什么可能是错的? TIA。

即使logging器级别设置为ALL,ConsoleHandler(logging器上的默认处理程序)仍具有缺省级别INFO。 这来自JAVA_HOME / jre / lib中的默认logging.properties

除了循环遍历所有处理程序并设置日志logging级别之外,我更喜欢仅设置控制台处理程序的级别:

 //get the top Logger Logger topLogger = java.util.logging.Logger.getLogger(""); // Handler for console (reuse it if it already exists) Handler consoleHandler = null; //see if there is already a console handler for (Handler handler : topLogger.getHandlers()) { if (handler instanceof ConsoleHandler) { //found the console handler consoleHandler = handler; break; } } if (consoleHandler == null) { //there was no console handler found, create a new one consoleHandler = new ConsoleHandler(); topLogger.addHandler(consoleHandler); } //set the console handler to fine: consoleHandler.setLevel(java.util.logging.Level.FINEST); 

在我的工作场所个人发现以下工作:

 public class Foo { private final static Logger logger = Logger.getLogger(Foo.class.getName()); public static final void main(String[] args) { ConsoleHandler ch = new ConsoleHandler(); ch.setLevel(Level.FINEST); Foo.logger.addHandler(ch); Foo.logger.setLevel(Level.FINEST); Foo.logger.finest("test"); } } 

如果你只是设置根或处理程序最好(独占),那么它不起作用。 当我将两者都设置为“最佳”时,它就可以工作。 他的解释是:

logging器及其处理程序都具有日志级别…过滤的顺序是logging器然后处理程序。 这意味着它会检查日志消息是否先通过logging器filter,然后将消息发送到各个处理程序进行过滤。

他进一步用下面的例子来解释它:

  • Logger myLogger具有FINEST级别和一个具有INFO级别的ConsoleHandler myHandler

  • myLogger.fine("foo") à消息使其通过logging器的filter,但通过处理程序的filter得到阻止…没有输出。

  • myLogger.info("foo") à传递两个filter,并输出foo

现在…

  • Logger myLogger具有INFO级别和一个具有FINEST级别的ConsoleHandler myHandler

  • myLogger.fine("foo") à消息被logging器的filter停止,并且永远不会处理该处理程序…没有输出。

  • myLogger.info("foo") à传递两个filter,并输出foo

现在…

  • Logger myLogger具有FINEST级别和单个ConsoleHandler myHandler ,其级别为FINEST

  • myLogger.fine("foo") à传递两个filter,并输出“ foo ”。

  • myLogger.info("foo") à传递两个filter,并输出foo

其他用户已经给出了很好的答案(ConsoleHandler有一个单独的级别variables)。 我重用我的应用程序logging器的级别,并将其复制到父级架构。 还可以随时随地在运行时刷新级别。

 // Set same level all loggers and handlers up to the parent level // OFF,SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST,ALL Logger logger = Logger.getLogger(this.getClass().getPackage().getName()); //Level level = Level.parse("FINEST"); Level level = logger.getLevel(); Logger tempLogger = logger; while(tempLogger != null) { tempLogger.setLevel(level); for(Handler handler : tempLogger.getHandlers()) handler.setLevel(level); tempLogger = tempLogger.getParent(); } 

您需要在logging器中的处理程序和logging器本身上设置日志级别。 日志logging只在两个级别的“最粗略”执行。 这是一个logging类,做这个工作。

 import java.io.PrintWriter; import java.io.StringWriter; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.logging.ConsoleHandler; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; public class Log { private static final Logger logger = Logger.getGlobal(); private static Level logLevel = Level.INFO; static { // Remove all the default handlers (usually just one console handler) Logger rootLogger = Logger.getLogger(""); Handler[] rootHandlers = rootLogger.getHandlers(); for (Handler handler : rootHandlers) { rootLogger.removeHandler(handler); } // Add our own handler ConsoleHandler handler = new ConsoleHandler(); handler.setLevel(logLevel); handler.setFormatter(new LogFormatter()); logger.addHandler(handler); logger.setLevel(logLevel); } public static class LogFormatter extends Formatter { @Override public String format(LogRecord record) { String stackTrace = ""; Throwable thrown = record.getThrown(); if (thrown != null) { StringWriter stacktraceWriter = new StringWriter(); try (PrintWriter writer = new PrintWriter(stacktraceWriter)) { thrown.printStackTrace(writer); } stackTrace = stacktraceWriter.toString(); } return ZonedDateTime.ofInstant(Instant.ofEpochMilli(record.getMillis()), ZoneId.of("UTC")).format(DateTimeFormatter.ISO_ZONED_DATE_TIME) + "\t" + record.getLevel() + "\t" + record.getMessage() + "\n" + stackTrace; } } private static final String classname = Log.class.getName(); private static String callerRef() { StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); if (stackTraceElements.length < 4) { return ""; } else { int i = 1; for (; i < stackTraceElements.length; i++) { if (stackTraceElements[i].getClassName().equals(classname)) { break; } } for (; i < stackTraceElements.length; i++) { if (!stackTraceElements[i].getClassName().equals(classname)) { break; } } if (i < stackTraceElements.length) { return stackTraceElements[i].toString(); } else { return "[in unknown method]"; } } } public static void setLogLevel(Level newLogLevel) { logLevel = newLogLevel; for (Handler handler : logger.getHandlers()) { handler.setLevel(newLogLevel); } Log.logger.setLevel(newLogLevel); } public static int getLevelNum() { return logLevel.intValue(); } public static int getLevelNum(Level level) { return level.intValue(); } public static void fine(String msg) { logger.log(Level.FINE, msg); } public static void info(String msg) { logger.log(Level.INFO, msg); } public static void warning(String msg) { logger.log(Level.WARNING, msg + "\t " + callerRef()); } public static void error(String msg) { logger.log(Level.SEVERE, msg + "\t " + callerRef()); } public static void exception(String msg, Throwable cause) { logger.log(Level.SEVERE, msg + "\t " + callerRef(), cause); } } 
 private final static Logger LOGGER = Logger.getLogger(WoTServer.class.getName()); for(Handler h : LOGGER.getParent().getHandlers()){ if(h instanceof ConsoleHandler){ h.setLevel(Level.ALL); } }