在普通的Java SE 6环境中:
Logger l = Logger.getLogger("nameless"); l.setLevel(Level.ALL); l.fine("somemessage");
Eclipse控制台中没有显示任何内容.l.info("")及以上版本工作正常,但任何低于罚款的东西似乎都不起作用.什么可能是错的?TIA.
即使Logger级别设置为ALL,ConsoleHandler(记录器上的默认处理程序)仍具有默认级别INFO.这来自JAVA_HOME/jre/lib中的默认logging.properties
我宁愿只设置控制台处理程序的级别,而不是遍历所有处理程序并设置日志记录级别:
//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"); } }
如果你只是将root或处理程序设置为最好(仅限于)那么它就不起作用了.当我把两者都设置为FINEST
然后它就可以了.他的解释是:
记录器及其处理程序都有日志级别...过滤的顺序是Logger然后是Handlers.这意味着它会检查日志消息是否首先通过记录器过滤器,然后将消息发送给各个处理程序进行过滤.
他使用以下示例进一步解释了它:
Logger myLogger
有一个水平FINEST
和ConsoleHandler myHandler
一个水平的INFO
myLogger.fine("foo")
àmess消息使它通过记录器的过滤器,但是由处理程序的过滤器获取停止...没有输出.
myLogger.info("foo")
à传递两个过滤器并foo
输出.
现在…
Logger myLogger
有一个水平INFO
和ConsoleHandler myHandler
一个水平的FINEST
myLogger.fine("foo")
à消息被记录器的过滤器停止,永远不会进入处理程序......没有输出.
myLogger.info("foo")
à传递两个过滤器并foo
输出.
现在…
Logger myLogger
有一个水平FINEST
和ConsoleHandler myHandler
一个水平的FINEST
myLogger.fine("foo")
à传递两个过滤器,foo
输出" ".
myLogger.info("foo")
à传递两个过滤器并foo
输出.