禁用awt / swing调试(精细)日志消息

我正在使用java日志记录将我的应用程序的日志消息写入日志文件和其他目标。 将日志级别设置为FINE ,我还从AWT / Swing中获取(不需要的)消息,例如:

 {0}, when grabbed {1}, contains {2} 

和别的。 查看JDK源代码(参见此处 ),可以看到相应记录器的名称是sun.awt.X11.grab.XWindowPeer

我从Java日志框架中理解的是,这个日志记录处理程序应该从其父类如sun.awtinheritance其日志级别。

我尝试了以下方法:

 Logger.getLogger("sun.awt").setLevel(Level.OFF); 

但AWT / Swing调试消息仍出现在日志输出中。

编程方式禁用这些日志消息的推荐方法是什么(同时仍允许来自其他来源的FINE消息)?

如果您只想记录自己应用程序消息 ,可以禁用所有消息,然后为应用程序显式启用消息:

 Logger.getRootLogger().setLevel(Level.OFF); Logger.getLogger("package.of.your.application").setLevel(Level.ALL); 

在用于记录的属性文件(例如logging.properties)中,这将是:

 .level = OFF package.of.your.application.level = ALL 

我今天遇到了同样的问题。 在谷歌搜索这是最高的url,我找不到一个好的答案来源,所以我会发布我的:)

假设Andre使用java.util.logging API,可以使用setFormatter(Formatter newFormatter)添加一个控制日志格式的Handler

所以我扩展了Formatter并检查了日志的类是否包含java.awt,javax.swing或sun.awt。

 class MyFormatLog extends Formatter { @Override public String format(LogRecord record) { if( !record.getSourceClassName().contains("java.awt") && !record.getSourceClassName().contains("javax.swing.") && !record.getSourceClassName().contains("sun.awt.") ) { //format my output... } else { return ""; } } } 

我再也找不到Logger类中的getRootLogger()方法了。 这对我有用:

 logger = Logger.getLogger("my.package"); Logger l = logger; while (l != null) { l.setLevel(Level.OFF); l = l.getParent(); } logger.setLevel(Level.FINER); 
  Logger.getLogger("java.awt").setLevel(Level.OFF); Logger.getLogger("sun.awt").setLevel(Level.OFF); Logger.getLogger("javax.swing").setLevel(Level.OFF); 

尝试Logger.getRootLogger()。setLevel(Level.OFF);