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

yan*_*nko 49 java logging

在普通的Java SE 6环境中:

Logger l = Logger.getLogger("nameless");
l.setLevel(Level.ALL);
l.fine("somemessage");
Run Code Online (Sandbox Code Playgroud)

Eclipse控制台中没有显示任何内容.l.info("")及以上版本工作正常,但任何低于罚款的东西似乎都不起作用.什么可能是错的?TIA.

Kev*_*vin 55

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

  • +1将此项添加到项目的记录器设置中以覆盖ConsoleHandler默认值:`java.util.logging.ConsoleHandler.level = FINE` (11认同)

mic*_*mit 35

我宁愿只设置控制台处理程序的级别,而不是遍历所有处理程序并设置日志记录级别:

//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);
Run Code Online (Sandbox Code Playgroud)

  • Thanx,但我同意真正的答案是设置日志记录级别,就像上面的答案一样.此解决方案更像是一种解决方法.我不明白为什么你不能在Eclise的控制台设置中设置日志记录级别.我曾经和JBuilder合作过,这是一个选择. (2认同)
  • ..hi 2009,这是2012年的召唤.对于现在必须使用像这个例子(我们认为当时是个好主意)的库/ jar的人来说,你可以通过添加jul-to-slf4j bridge继续使用新的,首选的slf4j + logback配置(jul-to-slf4j.jar)到类路径,像这样的代码*可能*工作.经验教训:将所有低级日志操作保留在代码之外,并在配置文件中配置日志记录级别(在本例中为-Djava.util.logging.config.file = {file},其中{file}是自定义的适当设置".level"的logging.properties版本. (2认同)

jwm*_*s81 17

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你只是将root或处理程序设置为最好(仅限于)那么它就不起作用了.当我把两者都设置为FINEST然后它就可以了.他的解释是:

记录器及其处理程序都有日志级别...过滤的顺序是Logger然后是Handlers.这意味着它会检查日志消息是否首先通过记录器过滤器,然后将消息发送给各个处理程序进行过滤.

他使用以下示例进一步解释了它:

  • Logger myLogger有一个水平FINESTConsoleHandler myHandler一个水平的INFO

  • myLogger.fine("foo") àmess消息使它通过记录器的过滤器,但是由处理程序的过滤器获取停止...没有输出.

  • myLogger.info("foo")à传递两个过滤器并foo输出.

现在…

  • Logger myLogger有一个水平INFOConsoleHandler myHandler一个水平的FINEST

  • myLogger.fine("foo") à消息被记录器的过滤器停止,永远不会进入处理程序......没有输出.

  • myLogger.info("foo")à传递两个过滤器并foo输出.

现在…

  • Logger myLogger有一个水平FINESTConsoleHandler myHandler一个水平的FINEST

  • myLogger.fine("foo")à传递两个过滤器,foo输出" ".

  • myLogger.info("foo")à传递两个过滤器并foo输出.