我遇到了java.util.logging的问题...我无法记录精细,精细和最好的关卡。
我在这里找到了理想的解决方案: Why are the Level.FINE logging messages not showing?
我已经创建了自己的类来获取适当的记录器实例:
public static Logger getLogger(Level level, String name) {
Logger logger;
logger = (name != null) ? Logger.getLogger(name) : Logger.getAnonymousLogger();
logger.setLevel(level);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(level);
logger.addHandler(handler);
return logger;
}
但在使用它之后,我的记录器会记录每个级别两次:
private static final Logger logger = testlogger.getLogger(Level.INFO, "testname");
public static void main(String[] args) {
try {
throw new IllegalArgumentException("Uuuuu!!!");
} catch (IllegalArgumentException e) {
logger.log(Level.SEVERE, "Something wrong");
logger.log(Level.WARNING, "Something wrong");
logger.log(Level.INFO, "Something wrong");
logger.log(Level.CONFIG, "Something wrong");
logger.log(Level.FINE, "Something wrong");
logger.log(Level.FINER, "Something wrong");
logger.log(Level.FINEST, "Something wrong");
}
}
输出:
08.07.2013 09:37:08 xxx.testclass主要SCHWERWIEGEND:出了点问题 08.07.2013 09:37:08 xxx.testclass主要SCHWERWIEGEND:出了点问题 08.07.2013 09:37:08 xxx.testclass主要警告:出了什么问题 08.07.2013 09:37:08 xxx.testclass主要警告:出了什么问题 08.07.2013 09:37:08 xxx.testclass主要信息:出错了 08.07.2013 09:37:08 xxx.testclass主要信息:出错了
我猜,Logger添加了一些默认处理程序,所以我尝试过:
for (Handler h : logger.getHandlers()) {
logger.removeHandler(h);
}
在添加ConsoleHanlder之前,但没有结果。
从我提到的帖子中,我了解到为了显示精细,精细,最精细的关卡,我必须添加ConsoleHandler。
所以我的问题是“如何强制记录器只使用ConsoleHandler”?
答案 0 :(得分:0)
我之前没有使用过Java Utilging,但根据我在Log4J / SLF4J的经验,你使用JUL的方式似乎很奇怪。
每次获取记录器时,我们都不会设置处理程序和记录器的级别。通常,它是在应用程序运行之前的一次性设置。因此,JUL已经正确设置了记录器层次结构,您只需获取要使用的记录器并进行记录。
您进行设置的方式也会造成很大的麻烦,因为每次获得相同的记录器时都会添加一个新的ConsoleHandler。这意味着,如果你得到它10次,你从第10次获得的记录器,每次记录将导致10条消息显示在屏幕上。
回到你的问题,我相信JUL中的根记录器默认设置为ConsoleHandler。这意味着,您并不需要自己设置ConsoleHandler,因为每个记录器都将遵循其父级的处理程序,而处理程序依次是根记录程序的处理程序。
在代码中删除ConsoleHandler设置并按照父代的处理程序进行操作。或者您可以将记录器的可加性更改为false(类似于JUL中的logger.setUseParentHandlers(false)
)。
但是,我的建议是对JUL有一些基本的了解,并知道应该如何使用它。