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

Java 禁用awt/swing调试(精细)日志消息,java,swing,logging,awt,Java,Swing,Logging,Awt,我使用java日志将应用程序的日志消息写入日志文件和其他目的地。将日志级别设置为FINE,我还从AWT/Swing获得(不需要的)消息,例如: {0}, when grabbed {1}, contains {2} 等等。查看JDK源代码(参见示例),可以看到相应记录器的名称是sun.awt.X11.grab.XWindowPeer 我从Java日志框架中了解到,这个日志处理程序应该从其父级继承其日志级别,如sun.awt 我尝试了以下方法: Logger.getLogger("sun.awt

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

{0}, when grabbed {1}, contains {2}
等等。查看JDK源代码(参见示例),可以看到相应记录器的名称是
sun.awt.X11.grab.XWindowPeer

我从Java日志框架中了解到,这个日志处理程序应该从其父级继承其日志级别,如
sun.awt

我尝试了以下方法:

Logger.getLogger("sun.awt").setLevel(Level.OFF);
但是AWT/Swing调试消息仍然显示在日志输出中

以编程方式禁用这些日志消息(同时仍然允许来自其他来源的
FINE
消息)的建议方法是什么
Logger.getRootLogger().setLevel(Level.OFF)

我今天也有同样的问题。在谷歌上搜索这是最热门的url,我没有找到一个好的答案来源,所以我会发布我的:)

假设Andre使用
java.util.logging
API,可以使用
setFormatter(Formatter newFormatter)
添加控制日志格式的
处理程序

因此,我扩展了格式化程序,并检查日志类是否包含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().setLevel(Level.OFF);
Logger.getLogger("package.of.your.application").setLevel(Level.ALL);
在用于日志记录的属性文件(例如logging.properties)中,这将是:

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

我在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);